如何用pandas.concat实现DataFrame.append追加Series效果
解决方案
完全可以通过pd.concat实现和原append方法完全一致的追加效果,你之前得到错位结果,是因为直接传入Series时concat的对齐逻辑和append不同,只要调整待拼接对象的结构即可。
问题原因
- 原
DataFrame.append()方法追加Series时,会自动将Series的name作为新行的行索引,将Series的索引和原DataFrame的列做匹配填充值。 - 直接将Series传入
pd.concat做纵向拼接时,函数默认会把Series作为新列处理,导致行、列索引错位,出现大量NaN值。
正确实现代码
只需要在拼接前将待追加的Series转换为和原透视表列结构一致的单行DataFrame,再做纵向拼接:
>>> import pandas as pd >>> df = pd.DataFrame({ ... 'id':['A','B','C','A','B','C'], ... 'par':['x','x','x','y','y','y'], ... 'val':[1,2,3,4,5,6]}) >>> pv = df.pivot_table(index="id", columns='par', values="val", aggfunc="sum") >>> avg = pv.mean().rename('MyFunc') >>> # 将Series转成单行DataFrame后纵向拼接 >>> pd.concat([pv, avg.to_frame().T]) par x y id A 1.0 4.0 B 2.0 5.0 C 3.0 6.0 MyFunc 2.0 5.0
关键操作avg.to_frame().T的作用:
to_frame()先将索引为x/y的平均值Series,转换为单列DataFrame.T做转置后,得到行索引为MyFunc、列名为x/y的单行DataFrame,和原透视表pv的列结构完全匹配,拼接后不会出现错位。
内容的提问来源于stack exchange,提问作者Orlando Rivera Letelier
相关产品推荐
相关产品推荐

