You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:58:10