首页 > 解决方案 > 在 Python 中循环遍历数据框

问题描述

我有一个数据框如下:

    c1     c2   c3  c4  c5  c6  c7
0   li      1   2   1   3   2   4
1   qian    2   3   3   5   4   2
2   qian    3   5   4   3   2   4
3   li      5   23  23  2   5   2
4   li      2   5   1   4   2   4
5   zhou    3   5   1   1   1   2

我正在尝试创建一个返回分组平均值的新列 c8。分组方法是:

groupby('c1')['c2'].transform('mean')  ---c2 can be replaced by c3 to c7

我当前的代码如下所示:

lst = [c1, c2, c3, c4,c5, c6, c7]
for i in range(len(lst)):
    res = df.groupby(df['c1'])[i].transform('mean')
    return res
df['c8'] = df[res]

错误说它找不到 c1。谁能告诉我如何生成分组平均值并使这个循环工作?

标签: pythonpandas

解决方案


这里有几个问题:

  1. 您收到的错误是因为您已将变量放入 list lst。这些应该是字符串(用引号括起来)

  2. 您正在迭代lst不是自身项目的索引lst- 例如,对于您的 for 循环的每次迭代,您的迭代器i1then 23而不是"c1" "c2" "c3"

  3. returnfor-loop. 几乎有 0 个理由将 return 语句放在 for 循环中,因为它完全停止了循环。

  4. 您可以在循环的每次迭代中简单地更新数据框,而不是将其存储到临时res变量中

您的 for 循环方法的工作示例如下所示

lst = ["c2", "c3", "c4", "c5", "c6", "c7"]
for column in lst:
    df[column] = df.groupby("c1")[column].transform('mean')

print(df)
     c1        c2  c3        c4  c5  c6        c7
0    li  2.666667  10  8.333333   3   3  3.333333
1  qian  2.500000   4  3.500000   4   3  3.000000
2  qian  2.500000   4  3.500000   4   3  3.000000
3    li  2.666667  10  8.333333   3   3  3.333333
4    li  2.666667  10  8.333333   3   3  3.333333
5  zhou  3.000000   5  1.000000   1   1  2.000000

更好的是,您可以一次提供所有要计算平均值的列,而无需显式循环:

lst = ["c2", "c3", "c4", "c5", "c6", "c7"]
average_df = df.groupby("c1")[lst].transform("mean") 

print(average_df)
         c2    c3        c4   c5   c6        c7
0  2.666667  10.0  8.333333  3.0  3.0  3.333333
1  2.500000   4.0  3.500000  4.0  3.0  3.000000
2  2.500000   4.0  3.500000  4.0  3.0  3.000000
3  2.666667  10.0  8.333333  3.0  3.0  3.333333
4  2.666667  10.0  8.333333  3.0  3.0  3.333333
5  3.000000   5.0  1.000000  1.0  1.0  2.000000

推荐阅读