【问题标题】: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)

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

【问题讨论】:

  • 你确定你的第一个块不起作用吗?我相信它通常会起作用。

标签: python pandas dataframe function loops


【解决方案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 代表列级别

第二部分

有两个问题:

  1. groupby 创建一个新的 DataFrame,如果您想再次使用它,必须将其分配给一个变量
  2. 由于您在函数中,因此您必须返回新的 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"]] 那么新的更改不会被保存。
猜你喜欢
  • 2017-10-27
  • 2012-05-30
  • 2020-11-02
  • 2015-05-13
  • 2020-08-30
  • 2018-11-13
  • 1970-01-01
  • 2021-05-16
  • 2021-12-15
相关资源
最近更新 更多