python - 在 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。谁能告诉我如何生成分组平均值并使这个循环工作?
解决方案
这里有几个问题:
您收到的错误是因为您已将变量放入 list
lst
。这些应该是字符串(用引号括起来)您正在迭代
lst
不是自身项目的索引lst
- 例如,对于您的 for 循环的每次迭代,您的迭代器i
是1
then2
,3
而不是"c1"
"c2"
"c3"
您
return
的for-loop
. 几乎有 0 个理由将 return 语句放在 for 循环中,因为它完全停止了循环。您可以在循环的每次迭代中简单地更新数据框,而不是将其存储到临时
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
推荐阅读
- sql - 为什么即使使用提交后 sql plus 也不会保存新行?
- reactjs - nginx基本身份验证每页询问凭据
- python - 使用 Python 发送的 WhatsApp 消息中的换行符
- regex - VSCode 在片段中链接正则表达式转换
- java - Karaf:连接被拒绝(公司代理,但代理在 Karaf/Maven 中正确配置)
- python-3.x - 如何防止 Tkinter 从属小部件指示自己的位置?
- python - 不和谐授权申请
- c++ - std::unordered_map 无法使用 std::map 成功的父类型编译
- objectmapper - jackson 中的 ObjectMapper 错误(消息:没有从字符串值反序列化的字符串参数构造函数/工厂方法)
- java - SpringBoot - 关系的实体传播