我有多个数据帧,我想在这些数据帧上运行这个函数,该函数主要从数据帧中删除不必要的列并返回一个数据帧:
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 的项目已经改变,但原始数据框 df1、df2、df3 仍然保留不必要的列。我怎么能做到这一点?
答案 0 :(得分:2)
如果我理解正确,您想将一个函数分别应用于多个数据帧。
潜在的问题是,在您的函数中,您返回一个新的数据帧,并将列表中存储的数据帧替换为新的数据帧,而不是修改旧的原始数据帧。
如果你想修改原始的,你必须使用 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
答案 1 :(得分:0)
原因可能是因为您使用的枚举错误。在你的情况下,你只想要索引,所以你应该做的是:
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):
...
或者你完全摆脱它,因为你以任何一种方式访问索引的值。