2017-05-27 66 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]中看到所需的結果。 –