如何让pandas pivot_table保留所有索引行并实现计数统计?
解决pivot_table丢失原始索引行的问题
问题描述:df1与df2左连接后,使用pivot_table做计数统计时,shtuff索引行从结果中缺失,需要保留该行并填充0值。
原因分析
左连接后,shtuff对应的C值为3,而df2中不存在C=3的记录,因此merge后的结果里D列全为NaN。pivot_table的count聚合函数会忽略NaN值,导致这一行被过滤。
解决方案
方法一:替换聚合函数为size
size会统计每组的总行数(包含NaN),能直接保留所有原始索引行,是最简洁的解决方式:
import pandas as pd df1 = pd.DataFrame({"A": ["foo", "bar", "shtuff"], "B": ["one", "two", "one"], "C": [1, 2, 3]}) df2 = pd.DataFrame({"C": [1,2,2,1,2,1,1,2,2], "D": ["A", "B", "A", "B", "A", "B", "A", "C", "A"]}) df = df1.merge(df2, how='left') pd.pivot_table(df, index='A', columns='D', values='C', aggfunc='size', fill_value=0)
运行结果:
D A B C A bar 3 1 1 foo 2 2 0 shtuff 0 0 0
方法二:重新索引补全缺失行
如果坚持使用count聚合函数,可在生成透视表后,用df1原始的A列值重新索引并填充0:
pivot_result = pd.pivot_table(df, index='A', columns='D', values='C', aggfunc='count', fill_value=0) # 重新索引补全缺失行,填充0并转成整数类型 pivot_result = pivot_result.reindex(df1['A']).fillna(0).astype(int)
该方法同样能得到期望结果,但size的实现方式更高效直接。
内容的提问来源于stack exchange,提问作者Juliepvr
相关产品推荐
相关产品推荐

