如何移除pandas Series中value_counts的计数值且保留原有表结构
问题说明
需求:将代码运行输出保持为pandas.Series类型,不改变表格原有多层级展示结构、不改动排布格式的前提下,移除value_counts()生成的计数值列。
已尝试的代码如下:
import pandas as pd df = pd.DataFrame({'A':['a','b'],'C':['1','2'], 'B':[[['A1', 'A2']],[['A1', 'A2', 'A3']]]}) df = df['B'].apply(lambda x: pd.Series(x[0])).stack().reset_index(level=1, drop=True).to_frame('B').join(df[['A','C']], how='left') print(df.groupby(['A', 'C']).value_counts().sort_index())
当前运行输出:
A C B a 1 A1 1 A2 1 b 2 A1 1 A2 1 A3 1 dtype: int64
预期输出:
A C B a 1 A1 A2 b 2 A1 A2 A3
实现方案
现有代码已经生成了符合层级要求的三层MultiIndex,value_counts()返回的Series中,索引就是目标的A/C/B层级结构,值是不需要展示的计数。直接保留原索引,将Series值替换为空字符串即可,全程不改动原有数据处理逻辑,也不会破坏原有的层级缩进、排序格式。
修正后完整代码:
import pandas as pd df = pd.DataFrame({'A':['a','b'],'C':['1','2'], 'B':[[['A1', 'A2']],[['A1', 'A2', 'A3']]]}) df = df['B'].apply(lambda x: pd.Series(x[0])).stack().reset_index(level=1, drop=True).to_frame('B').join(df[['A','C']], how='left') count_res = df.groupby(['A', 'C']).value_counts().sort_index() # 保留原有多层索引结构,替换值为空以移除计数展示 res = pd.Series([''] * len(count_res), index=count_res.index) print(res)
运行后输出和预期完全匹配,索引排布、层级缩进和原输出无差异,仅移除了右侧的计数字段。如果数据中存在重复的(A,C,B)组合,该方案也能和原代码的分组逻辑保持一致,不需要额外调整。
内容的提问来源于stack exchange,提问作者Berlin Benilo
相关产品推荐
相关产品推荐

