分类列排序值问题:验证含unstack、droplevel的groupby求和代码逻辑合理性
Pandas分组求和代码逻辑验证
你的代码逻辑是完全自洽的,能够得到预期的输出结果,只是存在冗余操作,可进一步简化。
现有代码逐行逻辑解析
data.groupby(['service_type']).sum():按分类列service_type分组,对所有数值列执行求和聚合,返回行索引为service_type各取值的DataFrame。若原数据仅含1个数值列,该结果为单列DataFrame。.unstack():将当前行索引转为列层级,因为分组后仅存在service_type一个行索引,操作后会返回多层索引(MultiIndex)的Series:第一层索引为原数值列的列名,第二层索引为service_type的各取值。如果原数据包含多个数值列,这一步会把所有列的求和结果拼接成一个一维Series。sort_values(ascending = False).head(10):按求和结果降序排序,取排名前10的条目。.droplevel(0):删除多层索引的第一层(即原数值列的列名),最终得到索引为service_type取值、值为对应求和结果的Top10 Series,和预期输出完全匹配。
更简洁的等价写法
你用到的unstack+droplevel属于冗余操作,完全可以省略,根据你的实际场景可选择更易读的实现:
- 仅对单个指定数值列求和取Top10:
# 替换your_value_col为你实际需要求和的数值列名 popular_ser2 = data.groupby('service_type')['your_value_col'].sum().sort_values(ascending=False).head(10)
- 对所有数值列求和后按指定列排序取Top10:
# 替换your_sort_col为你用来排序的数值列名 popular_ser2 = data.groupby('service_type').sum().sort_values(by='your_sort_col', ascending=False).head(10)
- 如果确实需要把多列的求和结果合并成一维全局排序取Top10,也可以用更直观的
stack实现:
popular_ser2 = data.groupby('service_type').sum().stack().sort_values(ascending=False).head(10).droplevel(0)
内容的提问来源于stack exchange,提问作者Azul
相关产品推荐
相关产品推荐

