循环遍历不同的数据帧并使用函数执行操作

Posted

技术标签:

【中文标题】循环遍历不同的数据帧并使用函数执行操作【英文标题】:Loop through different dataframes and perform actions using a function 【发布时间】:2022-01-15 12:49:27 【问题描述】:

我有 10 个具有相同结构(相同行数和列数)的数据帧,我正在尝试找到一种有效的方法来执行多项操作,例如使用 for 循环重命名列。我试过把它们放在一个列表中,比如

dfs = [df1, df2, df3]
for i in dfs:
    i.rename(columns='A': 'a1',inplace=True)

但它不起作用。如果我尝试使用函数然后循环,则会出现另一个问题,例如:

def groupdfs(anydf)
    anydf = anydf.groupby("A").sum

for i in dfs:
    groupdfs(i)

数据帧没有发生任何变化。我搜索了类似的旧问题,但没有任何效果。当您想对每个数据帧执行相同的更改时,循环遍历多个数据帧的最佳方法是什么?

【问题讨论】:

你确定你的第一个块不起作用吗?我相信它通常会起作用。 【参考方案1】:

您编写的第一段代码应该可以正常工作。

data = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
dff = pd.DataFrame(data, columns=['c', 'a', 'b'])

dff

    c   a   b
0   1   2   3
1   4   5   6
2   7   8   9

dato = np.array([(11, 12, 13), (41, 15, 16), (17, 18, 9)])
dfg = pd.DataFrame(data, columns=['c', 'a', 'b'])

dfg

    c   a   b
0   1   2   3
1   4   5   6
2   7   8   9

dffs = [dff, dfg]
for i in dffs:
    i.rename(columns='a': 'a1',inplace=True)

    c   a1  b
0   1   2   3
1   4   5   6
2   7   8   9

The only thing I can think of is that you should add a line in the end to save changes to files.

【讨论】:

当我在您的示例中执行循环并运行 dff 时,列名没有更改。就像您提到的那样没有保存更改。最后我将如何保存? @Sotomayor1989 如果您按照我的所有步骤操作,您应该得到相同的结果。很可能与命名文件或列有关。保存是指将更改保存回您的文件,pandas 数据框应该允许您查看结果 你说得对。我可以验证当我使用 inplace=True 时它确实执行了更改。但是如果我想对数据框进行切片,例如:for i in dfs: i = i[["a","b"]] 那么新的更改不会被保存。 @Sotomayor1989 您不需要切片任何内容,因为您只是替换特定列中的名称。尝试按原样使用代码并输入列名【参考方案2】:

第一部分

由于一切都是一样的,您可以创建一个包含新列名的列表并将其分配给所有列,如下所示:

column_names = ['a1', 'a2', 'a3']
for df in [df1, df2, df3]:
    df.columns = column_names

或者,如果您只想使用字典来更改某些列,您可以:

for df in [df1, df2, df3]:
    df.rename('A':'a1', axis=1, inplace = True)

注意axis = 1 代表列级别

第二部分

有两个问题:

    groupby 创建一个新的 DataFrame,如果您想再次使用它,必须将其分配给一个变量 由于您在函数中,因此您必须返回新的 DataFrame 以分配给函数外部的变量,如下所示:
def groupdfs(anydf)
    return anydf.groupby("A").sum()

for i in dfs:
    i = groupdfs(i)

这将用新的 groupby 替换旧的 DataFrame。最好为新的 groupby 数据框创建新变量

【讨论】:

感谢您的回答。关于第一部分,如果我想做另一个动作,例如将现有数据帧切片为更小的数据帧,那么似乎没有保存更改。如果我想对数据框进行切片,例如:for i in dfs: i = i[["a","b"]] 那么新的更改不会被保存。

以上是关于循环遍历不同的数据帧并使用函数执行操作的主要内容,如果未能解决你的问题,请参考以下文章

Pandas循环遍历数据帧并使用while循环列表

spark中将每个组作为新数据帧并在循环中传递另一个函数的最佳方法是啥?

python 将csv文件转换为Pandas数据帧并遍历其行的函数

循环遍历 Pandas 数据帧并根据条件复制到新数据帧

PL/pgSQL 函数 - 遍历特定列并在循环中执行第二个查询

操作列表