如何将pandas groupby+value_counts(normalize=True)结果转为DataFrame?
解决groupby后value_counts转DataFrame的索引冲突问题
执行groupby(['C', 'B'])['A'].value_counts(normalize=True)后得到的Series,其name是'A',同时多级索引里也包含'A'字段。直接调用reset_index()时,pandas会尝试把索引中的'A'转为列,又要保留原Series的name作为列名,导致列名重复,触发ValueError: cannot insert A, already exists。
以下几种方法可以解决这个问题:
- 方法一:先重命名Series的占比列
# 把原Series的name改成新的列名(比如proportion) grouped = grouped.rename('proportion') df = grouped.reset_index()
- 方法二:用to_frame直接指定列名
# 将Series转为DataFrame时直接指定占比列的名称 df = grouped.to_frame(name='proportion').reset_index()
- 方法三:使用reset_index的names参数(pandas 1.5.0+适用)
# 通过names参数一次性指定所有列名,覆盖原Series的name df = grouped.reset_index(names=['C', 'B', 'A', 'proportion'])
执行任意一种方法后,都能得到包含C、B、A和占比列的4列DataFrame。
内容的提问来源于stack exchange,提问作者curious
相关产品推荐
相关产品推荐

