如何迭代pandas中的Dataframe列表?

qxsslcnc  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(374)

我有多个dataframe,我想在上面运行这个函数,它主要从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

现在我遍历Dataframe列表:[df1,df2,df3]

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

虽然dfsublist的项已更改,但原始Dataframedf1、df2、df3仍保留不必要的列。我怎样才能做到这一点?

busg9geu

busg9geu1#

如果我理解正确,你想把一个函数分别应用于多个Dataframe。
底层问题是,在函数中返回一个新的Dataframe,并用新的Dataframe替换列表中存储的Dataframe,而不是修改旧的原始Dataframe。
如果你想修改原始的,你必须使用 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
wswtfjt7

wswtfjt72#

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

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):
    ...

或者您完全摆脱它,因为您可以通过任何一种方式访问带有索引的值。

相关问题