df:
id flag year amt
1 'Y' 2016 100
1 'Y' 2017 200
1 'Y' 2018 100
2 NaN 2016 100
2 'Y' 2017 200
我将重点放在year
和amt
上。
预期输出:
id flag 2016 2017 2018
1 'Y' 100.0 200.0 100.0
2 NaN 100.0 NaN NaN
2 'Y' NaN 200.0 NaN
代码:
t = df.pivot_table(index['id','flag'],columns='year',values='amt').reset_index()
实际输出,我得到的是上面的代码:
id flag 2016 2017 2018
1 'Y' 100.0 200.0 100.0
2 'Y' NaN 200.0 NaN
我不确定为什么透视表会过滤掉flag
中NaN
是df
的记录。我应该如何获得预期的结果?
答案 0 :(得分:1)
此处:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html 似乎没有理想的解决方案。因此,您可以这样做:
t = df.fillna(0).pivot_table(index=['id','flag'],columns='year',values='amt').reset_index()
t['flag'].mask(t['flag'].eq(0),np.nan,inplace=True)
输出:
year id flag 2016 2017 2018
0 1 'Y' 100.0 200.0 100.0
1 2 NaN 100.0 NaN NaN
2 2 'Y' NaN 200.0 NaN
将NaN
更改为一个值,然后pivot
并使用NaN
重置mask
答案 1 :(得分:1)
您可以使用set_index/unstack
:
In [51]: df.set_index(['id','flag','year'])['amt'].unstack('year').reset_index()
Out[51]:
year id flag 2016 2017 2018
0 1 Y 100.0 200.0 100.0
1 2 NaN 100.0 NaN NaN
2 2 Y NaN 200.0 NaN
set_index(['id', 'flag', 'year'])
将id
,flag
和year
列移到MultiIndex中。 unstack('year')
将MultiIndex的year
级移动到列索引中。与pivot_table
不同,索引级别的NaN
值被保留。