我有一个数据框如下:
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。谁能告诉我如何生成分组平均值并使这个循环起作用?
答案 0 :(得分:1)
这里有几个问题:
您收到的错误是因为您已将变量放入列表 lst
。这些应该是字符串(用引号括起来)
您正在迭代 lst
的索引而不是 lst
本身的项目 - 例如对于 for 循环的每次迭代,您的迭代器 i
是 1
然后 2
然后 3
,而不是 "c1"
"c2"
{{1} }
您的 "c3"
中有一个 return
语句。将 return 语句放入 for 循环的理由几乎为零,因为它会完全停止循环。
您可以在循环的每次迭代中简单地更新数据帧,而不是将其存储到临时 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