【问题标题】:How to iterate over a list of dataframes in pandas?如何迭代熊猫中的数据框列表?
【发布时间】:2021-07-20 15:57:41
【问题描述】:

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

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

【问题讨论】:

  • 如果你的dfs量少,可以试试df1, df2, df3 = [dropunnamednancols(df) for df in dfsublist]
  • 这是一个很好的提示。我通过 dfsublist = [dropunnamednancols(df) for df in dfsublist] 尝试了列表理解,这当然没有成功。谢谢

标签: python pandas dataframe


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 是的,这正是我想要实现的。感谢您的提示!
  • 很高兴我能帮上忙。您能否也将答案标记为“已接受的答案”?这可以帮助未来的读者遇到类似的问题。编码愉快!
【解决方案2】:

原因可能是因为您使用了错误的枚举。在你的情况下,你只需要索引,所以你应该做的是:

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

Enumerate 返回一个索引元组和列表中的实际值。所以在你的代码中,循环变量索引实际上会被赋值:

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

因此,您可以正确使用枚举并解压缩元组:

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

或者你完全摆脱它,因为你使用索引访问值。

【讨论】:

  • 我认为这不是问题所在,他想更改原始数据框,只是使用数据框列表将功能应用于它们。
  • 是的,安德烈亚斯是正确的。我也用枚举尝试了这两种解决方案。问题是我想更改原始数据框,而我的方法只更改了一个副本。
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2020-05-17
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多