我有一个数据集,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
我从中编写了一些代码来生成数据透视表来汇总测试结果,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
从那里,我从数据透视表创建热图以实现可视化目的。 一般来说,这是有效的。但是,如果由于某种原因,所选组中没有学生选择其中一个答案(例如,没有人为任何问题选择“D”),则该列不会显示在热图中;该列被保留。
即使没有人选择该答案,如何确保所有必需的列都显示在热图中?
我认为更简单的方法是将“dropna = False”添加到数据透视表参数中,默认行为设置为“True”。这对我来说在类似的情况下适用于包含大量 NaN 的时间序列数据。
pd.pivot_table(dropna = False)
Run Code Online (Sandbox Code Playgroud)
您可以获取所有可能的答案和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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
对应的热图:
import matplotlib.pyplot as plt
import seaborn as sns
sns.heatmap(res, annot=True)
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)