循环遍历 Python 中的数据帧

时间:2021-02-12 22:26:59

标签: python pandas

我有一个数据框如下:

    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。谁能告诉我如何生成分组平均值并使这个循环起作用?

1 个答案:

答案 0 :(得分:1)

这里有几个问题:

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

  2. 您正在迭代 lst 的索引而不是 lst 本身的项目 - 例如对于 for 循环的每次迭代,您的迭代器 i1 然后 2 然后 3,而不是 "c1" "c2" {{1} }

  3. 您的 "c3" 中有一个 return 语句。将 return 语句放入 for 循环的理由几乎为零,因为它会完全停止循环。

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

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

res

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

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