熊猫数据透视表中缺少值?

时间:2019-06-19 16:49:33

标签: python pandas

我有一个数据集,如下所示:

student     question                        answer   number
Bob         How many donuts in a dozen?       A        1
Sally       How many donuts in a dozen?       C        1
Edward      How many donuts in a dozen?       A        1
....
Edward      What colour is the sky?           C        1
Marvin      What colour is the sky?           D        1

我从中编写了一些代码,这些代码生成了一个数据透视表以汇总测试结果,如下所示:

data = pd.pivot_table(df,index=['question'],columns = ['answer'],aggfunc='count',fill_value = 0)

                                   number
                     answer     A    B   C   D
       question
How many donuts in a dozen?     1    4   3   2
What colour is the sky?         1    9   0   0

从那里,我从数据透视表创建一个热图以进行可视化。 通常这可行。但是,如果由于某种原因,所选集中没有一个学生选择了一个答案(例如,没有人选择任何问题选择“ D”),则该列不会显示在热图中;该列将保留。

即使没有人选择答案,如何确保所有必填列都显示在热图中?

2 个答案:

答案 0 :(得分:4)

您可以采取所有可能的答案,并reindex您的结果。例如,在您提供的小样本中,没有学生选择B。假设您的选项是A,B,C,D:


answers = [*'ABCD']

res = df.pivot_table(
  index='question',
  columns='answer',
  values='number',
  aggfunc='sum',
  fill_value=0
).reindex(answers, axis=1, fill_value=0)

answer                       A  B  C  D
question
How many donuts in a dozen?  2  0  1  0
What colour is the sky?      0  0  1  1

相应的热图:

import matplotlib.pyplot as plt
import seaborn as sns
sns.heatmap(res, annot=True)
plt.tight_layout()
plt.show()

enter image description here

答案 1 :(得分:0)

我认为更简单的方法是在数据透视表参数中添加“ dropna = False”,默认行为设置为“ True”。在类似的情况下,这适用于包含大量NaN的时间序列数据的时间序列数据。

null