如何在Pandas中对多州数据应用where函数计算占比?
问题:Pandas计算各州数据占比时仅单个州有结果,其余为NaN
你的代码仅针对California计算了占比,其他州因不满足filter1,where返回NaN,导致最终占比列显示为NaN。以下是两种解决方法,推荐使用第一种更简洁高效的方案:
方法一:使用groupby+transform(推荐)
通过按state分组,自动计算每个州的总和并匹配到对应行,一次性完成所有州的占比计算:
df['percentage'] = df['total'] / df.groupby('state')['total'].transform('sum')
原理说明
groupby('state'):将数据按州名分组transform('sum'):计算每组(每个州)的total总和,并将该值广播到组内的每一行- 最终每行的
total除以对应州的总和,得到该数据在所属州的占比
方法二:使用np.select多条件匹配
如果坚持用条件过滤的方式,可以用numpy.select为不同州分配对应的计算逻辑:
import numpy as np filter1 = df['state'] == 'California' filter2 = df['state'] == 'Texas' filter3 = df['state'] == 'Florida' # 定义每个州对应的占比计算规则 conditions = [filter1, filter2, filter3] values = [ df['total'] / df[filter1]['total'].sum(), df['total'] / df[filter2]['total'].sum(), df['total'] / df[filter3]['total'].sum() ] df['percentage'] = np.select(conditions, values, default=np.nan)
注意事项
这种方式适合州数量较少的场景,若后续新增州需手动添加条件,扩展性不如groupby方案。
预期输出示例
处理后所有州的占比列都会得到对应值:
Year state total percentage 2014 California 914198.0 0.134925 2014 Florida 766441.0 0.465712 2014 Texas 1045274.0 0.512345 2015 California 874642.0 0.129087 2015 Florida 878760.0 0.534288
内容的提问来源于stack exchange,提问作者Chang
相关产品推荐
相关产品推荐

