ivot_table没有给出预期的结果

时间:2019-09-02 18:08:44

标签: python pandas

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

我将重点放在yearamt上。

预期输出:

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

我不确定为什么透视表会过滤掉flagNaNdf的记录。我应该如何获得预期的结果?

2 个答案:

答案 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'])idflagyear列移到MultiIndex中。 unstack('year')将MultiIndex的year级移动到列索引中。与pivot_table不同,索引级别的NaN值被保留。