如何按城市分组统计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
相关产品推荐
相关产品推荐

