簡體   English   中英

如何遍歷 pandas 中的數據幀列表?

[英]How to iterate over a list of dataframes in pandas?

我有多個數據幀,我想在其上運行此 function 主要從 dataframe 中刪除不必要的列並返回 dataframe:

def dropunnamednancols(df):
    """
    Drop any columns staring with unnamed and NaN

    Args:
        df ([dataframe]): dataframe of which columns to be dropped
    """
    
    #first drop nan columns
    df = df.loc[:, df.columns.notnull()]
    #then search for columns with unnamed 
    df = df.loc[:, ~df.columns.str.contains('^Unnamed')]
    
    return df

現在我遍歷數據框列表: [df1, df2, df3]

dfsublist = [df1, df2, df3]
for index in enumerate(dfsublist):
    dfsublist[index] = dropunnamednancols(dfsublist[index])

盡管dfsublist的項目已更改,但原始數據框df1df2df3仍保留不必要的列。 我怎么能做到這一點?

如果我理解正確,您想將 function 分別應用於多個數據幀。

潛在的問題是,在您的 function 中,您返回一個新的 dataframe 並將列表中存儲的 dataframe 替換為舊的而不是修改。

如果你想修改原來的,你必須使用 pandas 函數的 inplace inplace=True參數。 這是可能的,但不推薦,如此處所示

因此,您的代碼可能如下所示:

def dropunnamednancols(df):
    """
    Drop any columns staring with unnamed and NaN

    Args:
        df ([dataframe]): dataframe of which columns to be dropped
    """

    cols = [col for col in df.columns if (col is None) | (col.startswith('Unnamed'))]
    df.drop(cols, axis=1, inplace=True)

作為示例數據的示例:

import pandas as pd
df_1 = pd.DataFrame({'a':[0,1,2,3], 'Unnamed':[9,8,7,6]})
df_2 = pd.DataFrame({'Unnamed':[9,8,7,6], 'b':[0,1,2,3]})

lst_dfs = [df_1, df_2]

[dropunnamednancols(df) for df in lst_dfs]

# df_1 
# Out[55]: 
#    a
# 0  0
# 1  1
# 2  2
# 3  3
# df_2
# Out[56]: 
#    b
# 0  0
# 1  1
# 2  2
# 3  3

原因可能是因為您使用了錯誤的枚舉。 在您的情況下,您只需要索引,所以您應該做的是:

for index in range(len(dfsublist)):
    ...

Enumerate 返回索引的元組和列表中的實際值。 因此,在您的代碼中,實際上將分配循環變量索引:

(0, df1) # First iteration
(1, df2) # Second iteration
(2, df3) # Third iteration

因此,您可以正確使用 enumerate 並解壓縮元組:

for index, df in enumerate(dfsublist):
    ...

或者您完全擺脫它,因為您以任何一種方式使用索引訪問值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM