首页 > 解决方案 > 如何迭代熊猫中的数据框列表?

问题描述

我有多个数据框,我想在其上运行此函数,该函数主要从数据框中删除不必要的列并返回一个数据框:

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仍保留不必要的列。我怎么能做到这一点?

标签: pythonpandasdataframe

解决方案


如果我理解正确,您想将一个函数分别应用于多个数据帧。

潜在的问题是,在您的函数中,您返回一个新的数据框,并用新的自己的而不是修改旧的原始数据框替换列表中存储的数据框。

如果你想修改原来的,你必须使用inplace=Truepandas 函数的参数。这是可能的,但不推荐,如此处所示

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

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

推荐阅读