为什么迭代pandas groupby求和后的结果无法遍历所有数据行?
原因说明
直接对Pandas的DataFrame执行for row in df遍历操作时,默认迭代的对象是DataFrame的列名,而非行数据。
你调用gk.sum()得到的结果里,只有Items Shipped是数值列,Name属于字符串类型,默认不会参与sum()聚合计算,会被自动丢弃,因此最终返回的DataFrame只有1个列Items Shipped,遍历的时候自然只会输出这个字符串。
另外groupby('ASIN')之后得到的聚合结果,ASIN会默认作为索引存在,不会出现在常规列里,这也是直接遍历拿不到ASIN字段的原因之一。
修复后的代码实现
- 第一步先调整分组聚合逻辑,保留需要的字段:
import pandas as pd df = pd.read_csv('data.csv') # as_index=False 让ASIN作为普通列返回,而不是索引 # agg自定义每个字段的聚合规则:Name取同一个ASIN下的第一个值,Items Shipped求和 grouped_res = df.groupby('ASIN', as_index=False).agg( Name = ('Name', 'first'), Items_Shipped = ('Items Shipped', 'sum') )
如果同一个ASIN对应多个Name需要全部保留,可以把Name的聚合规则改成Name = ('Name', ','.join),会把所有Name拼接成一个字符串。
- 第二步用
iterrows()方法迭代每一行数据:
for idx, row in grouped_res.iterrows(): print(row['Name'], row['ASIN'], row['Items_Shipped'])
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

