将DataFrame多值透视到列:解决透视后NaN及行数异常问题
解决Pivot后出现NaN及行数不符的问题
你的问题出在pivot的索引参数没包含time,导致分组逻辑错误,才会出现大量NaN且行数和原数据一致。
修正后的代码
首先,index需要包含所有用来区分唯一行的字段:index、time、type,这样才能正确按行分组,把test的唯一值转成列:
# 执行pivot并重置索引,去掉列名的层级 df_pvt = df.pivot( index=['index', 'time', 'type'], columns='test', values='value' ).reset_index().rename_axis(columns=None)
如果你的数据中存在(index, time, type, test)的重复组合(即同一分组下有多个value),pivot会报错,这时候改用pivot_table并指定聚合函数即可:
df_pvt = df.pivot_table( index=['index', 'time', 'type'], columns='test', values='value', aggfunc='mean' # 可以根据需求换成sum、first等 ).reset_index().rename_axis(columns=None)
为什么原代码不行?
你之前只把index和type作为索引,但time也是区分不同行的关键字段——同一个index+type下有多个time值,pivot会把每个time和test的组合都单独生成一行,自然行数和原数据一样,且如果某个time+test的组合不存在,就会出现NaN。
示例验证
用你给出的测试数据执行修正后的代码,会得到如下结果(和你的期望一致,其中你期望里test2的0.01行值应为0.113,是原数据的对应值):
| index | time | test1 | test2 | type |
|---|---|---|---|---|
| 0 | 0.00 | 0.112 | 0.112 | A |
| 1 | 0.01 | 0.113 | 0.113 | A |
内容的提问来源于stack exchange,提问作者Mark R
相关产品推荐
相关产品推荐

