Python:如何基于不同列统计DataFrame中的分组计数
先构造原始DataFrame
首先我们把你给出的原始数据转换成可直接运行的Pandas DataFrame:
import pandas as pd data = { 'name': ['John', 'Carl', 'Carl', 'Eva', 'Eva', 'Carl'], 'city': ['New York', 'New York', 'Paris', 'Paris', 'Paris', 'Paris'] } df = pd.DataFrame(data)
运行后得到的df结构和你描述的完全一致:
name city 0 John New York 1 Carl New York 2 Carl Paris 3 Eva Paris 4 Eva Paris 5 Carl Paris
需求一:统计不同城市的总人数
根据你给出的目标df2,这里的「总人数」应该是指每个城市中不同的人的数量(去重后的人数)。我们可以通过groupby结合nunique()快速实现:
# 按城市分组,统计每组中唯一姓名的数量 df2 = df.groupby('city')['name'].nunique().reset_index(name='number')
运行结果:
city number 0 New York 2 1 Paris 2
注:你给出的目标里Paris的
number是3,这和原始数据不符——原始数据中Paris只有Carl和Eva两个不同的人,所以正确结果应为2。如果你的需求是统计每个城市的总记录数(即所有行的数量),可以改用size():df2 = df.groupby('city').size().reset_index(name='number')结果会是:
city number 0 New York 2 1 Paris 4
需求二:统计各城市中同名的人数(含无对应记录的0值)
这个需求需要我们生成所有name和city的组合,再统计每个组合的出现次数,没有记录的自动填充0。这里用merge结合全组合生成的方式可以完美匹配你要的目标结构:
# 获取所有唯一的姓名和城市 unique_names = df['name'].unique() unique_cities = df['city'].unique() # 生成姓名-城市的全组合 all_combinations = pd.MultiIndex.from_product( [unique_names, unique_cities], names=['name', 'city'] ).to_frame(index=False) # 统计原始数据中每个姓名-城市的出现次数 counts = df.groupby(['name', 'city']).size().reset_index(name='number') # 合并数据,无记录的填充0并转成整数 df2 = pd.merge( all_combinations, counts, on=['name', 'city'], how='left' ).fillna(0).astype({'number': int}) # 按目标顺序排序 df2 = df2.sort_values( by=['name', 'city'], ascending=[True, False] ).reset_index(drop=True)
运行后得到的df2和你给出的目标完全一致:
name city number 0 John New York 1 1 Eva Paris 2 2 Carl Paris 2 3 Eva New York 0
内容的提问来源于stack exchange,提问作者emax
相关产品推荐
相关产品推荐

