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

如何按城市分组统计Pandas DataFrame中min_workers的区间条目数?

按城市分组统计符合条件的条目数解决方案

原代码问题分析

你当前代码里用transform('count')是错误的——count方法会统计分组内所有非缺失值的总数,不管布尔条件是否成立,所以最终得到的是每个城市的总行数,而非符合条件的条目数。

正确实现方法

布尔值在Pandas中会被解析为1(True)和0(False),因此对布尔序列求和就能得到满足条件的条目数。修改后的代码如下:

import pandas as pd

pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

data = [['ATTICA',1,2,590,680],['ATTICA',1,2,800,1080],['AVON',14,2,950,1250],['AVON',15,3,500,870],['AVON',20,4,1350,1700]]
df = pd.DataFrame(data, columns=['cities','min_workers','max_workers','min_minutes','max_minutes'])

# 统计每组min_workers <15的条目数
df['Non_HT_Outages'] = (df['min_workers'] < 15).groupby(df['cities']).transform('sum')
# 统计每组min_workers >=15的条目数
df['HT_Outages'] = (df['min_workers'] >= 15).groupby(df['cities']).transform('sum')

print(df)

运行结果

执行后会得到符合预期的DataFrame:

cities  min_workers  max_workers  min_minutes  max_minutes  Non_HT_Outages  HT_Outages
0  ATTICA            1            2          590          680               2           0
1  ATTICA            1            2          800         1080               2           0
2    AVON           14            2          950         1250               1           2
3    AVON           15            3          500          870               1           2
4    AVON           20            4         1350         1700               1           2

另一种实现方式(先统计再合并)

如果需要先单独统计各组的结果再合并到原表,也可以用groupby+agg结合merge:

# 先按城市分组统计
group_stats = df.groupby('cities').agg(
    Non_HT_Outages=('min_workers', lambda x: (x < 15).sum()),
    HT_Outages=('min_workers', lambda x: (x >= 15).sum())
)
# 合并到原DataFrame
df = df.merge(group_stats, on='cities', how='left')

内容的提问来源于stack exchange,提问作者ASH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:07:06