Pandas使用groupby统计各国水果数量并保留完整dataframe的实现方法
你之前的写法会将DataFrame聚合为每个国家仅一行的统计结果,直接覆盖原df会丢失其余列和原有行结构,不符合需求。
可以使用pandas的transform方法实现需求,它会在分组计算后将统计结果广播到分组内的所有行,返回和原数据长度一致的序列,直接作为新列赋值即可,不会改变原数据的结构。
核心实现代码
df['Number'] = df.groupby('Country')['Fruits'].transform('count')
完整可运行示例
import pandas as pd # 构造样本数据集 data = { 'Country': ['India','India','India','India','Germany','Germany','Germany','Japan','Japan'], 'Fruits': ['Mango','Apple','Banana','Grapes','Apple','Mango','Kiwi','Kaki','melon'], 'Price': [200,250,50,150,350,500,200,300,200], 'Sold': ['Market','Shops','Market','Road','Supermarket','Supermarket','Online','Online','Supermarket'], 'Weather': ['sunny','sunny','winter','sunny','Autumn','Rainy','Spring','sunny','sunny'] } df = pd.DataFrame(data) # 新增每个国家对应水果数量的统计列 df['Number'] = df.groupby('Country')['Fruits'].transform('count') # 输出结果和预期完全一致 print(df)
可选替代方案
如果是更复杂的多维度统计场景,也可以先计算分组统计结果,再通过merge关联回原数据集:
# 先统计每个国家的水果数量 count_df = df.groupby('Country')['Fruits'].count().reset_index(name='Number') # 关联回原数据集 df = df.merge(count_df, on='Country', how='left')
内容的提问来源于stack exchange,提问作者Nithya Babu
相关产品推荐
相关产品推荐

