如何调整pandas聚合逻辑使Difference列每个唯一值仅单独展示一次
问题原因
你编写的聚合逻辑中,Difference(%)列对应的lambda函数接收的参数x是当前分组下所有Value值组成的Series对象,直接对x做算术运算会返回和分组元素数量相同的结果序列,最终就会在对应行展示多值列表,不符合单值需求。
解决方案
因为同一个分组下的Value值完全一致,只需要在lambda函数中取分组的任意一个Value值参与运算即可,最简单的方式是取分组第一个元素x.iloc[0]。
修改后的完整代码如下:
import pandas as pd import numpy as np a = np.array([12,12,12,9,43,43,43,22,8,9,9,43]) df = pd.DataFrame({'Value': a}) res = (df.groupby('Value', as_index=False) .agg(**{'Repetition Count': ('Value', 'size'), 'Percent(%)': ('Value', lambda x: round(x.size/len(a) *100, 2)), 'Difference(%)': ('Value', lambda x: round((x.iloc[0]-10)/10 *100, 2))}) )
运行后输出的Difference(%)列就和预期效果一致:
0 -20.0 1 -10.0 2 20.0 3 120.0 4 330.0 Name: Difference(%), dtype: float64
可选优化方案
你也可以把Difference(%)的计算放到分组聚合之后执行,代码可读性和运行效率更高:
res = df.groupby('Value', as_index=False).agg( 重复次数=('Value', 'size'), 占比=('Value', lambda x: round(x.size/len(a)*100, 2)) ) res['Difference(%)'] = round((res['Value']-10)/10 *100, 2)
内容的提问来源于stack exchange,提问作者georgehere
相关产品推荐
相关产品推荐

