这是一个早在2013年就被发现的一个小问题:即pandas.pivot_table()的index
里边含有空值的,空值的对应透视数据会被忽略。
使用pd.fillna()
import pandas
import numpy
a = [['a', 'b', 12, 12, 12], ['a', numpy.nan, 12.3, 233., 12], ['b', 'a', 123.23, 123, 1], ['a', 'b', 1, 1, 1.]]
df = pandas.DataFrame(a, columns=['a', 'b', 'c', 'd', 'e'])
df_pivot = df.pivot_table(index=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum)
print(df)
# df如下
a b c d e
0 a b 12.00 12 12
1 a NaN 12.30 233 12
2 b a 123.23 123 1
3 a b 1.00 1 1
print(df_pivot)
# df_pivot如下
c d e
a b
a b 13.00 13 13 # [a NaN 12.30 233 12] 默认删除不计
b a 123.23 123 1
解决方法:使用df.fillna(‘string’)把空值出填充个字符串就OK了。例如(原文链接点击这里)
In [31]: df2 = df.copy()
In [32]: df2['dummy'] = np.nan
In [33]: df2['b'] = df2['b'].fillna('dummy')
In [34]: df2
Out[34]:
a b c d e dummy
0 a b 12.00 12 12 NaN
1 a dummy 12.30 233 12 NaN
2 b a 123.23 123 1 NaN
3 a b 1.00 1 1 NaN
# 此处,之前被删除的那一行的值又回来了
In [35]: df2.pivot_table(index=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum)
Out[35]:
c d e
a b
a b 13.00 13.0 13.0
dummy 12.30 233.0 12.0
b a 123.23 123.0 1.0
In [36]: df2.pivot_table(index=['a', 'b'], values=['c', 'd', 'e'], aggfunc=sum).replace('dummy',np.nan)
Out[36]:
c d e
a b
a b 13.00 13.0 13.0
nan 12.30 233.0 12.0
b a 123.23 123.0 1.0