2017-05-27 62 views
0

我有一个数据框列表,我正在使用for循环在列表上执行一个操作。 df1,df2,df3和df4是数据帧。在操作之后,我没有找到数据框上的修改。请帮我理解我错过了什么以及为什么这不起作用?循环访问数据框列表并执行操作

为了让更改传递给源数据框,需要做些什么修改。

sheetnames = [df1, df2, df3, df4] 
i=0 
for sheet in sheetnames:  
    ixNaNList = sheet[sheet.isnull().all(axis=1) == True].index.tolist() 
    if len(ixNaNList) > 0: 
     ixNaN = ixNaNList[0] 
     sheetnames[i]=sheet[:ixNaN] 
    i=i+1 

回答

3

你assingment sheetnames[i] = ...替换名单sheetnames与任何sheet[:ixNaN]计算结果为第i个元素。

因此它对df1,df2,df3df4的含量没有影响。

+0

能否请你帮我我怎么修改DF1,DF2,DF3或DF4 dataframes。 –

0

试试这个:

sheetnames = [df1, df2, df3, df4] 
def drop_after_na(df): 
    return df[df.isnull().all(axis=1).astype(int).cumsum() <= 0] 
sheetnames = map(drop_after_na, sheetnames) 

,并尝试这个办法:

sheetnames = ['df1', 'df2', 'df3', 'df4'] 
for sheet in sheetnames: 
    exec('{sheet} = {sheet}[{sheet}.isnull().all(axis=1).astype(int).cumsum() <= 0]'.format(sheet=sheet)) 
+0

实际上,在空行被击中之后,我将删除所有行。感谢您的帮助 –

+0

好!你可以试试这个! – xmduhan

+0

感谢您的帮助!但是,虽然'df [df.isnull()。all(axis = 1).astype(int).cumsum()<= 0]'在df中删除了NAs后的所有行,但此更改不会传递到df1,df2使用地图功能。有趣的是,我可以在sheetnames [i]中看到所需的结果。 –