每列中每个值的计数热图
Posted
技术标签:
【中文标题】每列中每个值的计数热图【英文标题】:Heatmap of counts of every value in every column 【发布时间】:2020-12-24 16:39:03 【问题描述】:我有一个这样的数据框:
| A | B | C | D |
|---|---|----|---|
| 1 | 3 | 10 | 4 |
| 2 | 3 | 1 | 5 |
| 1 | 7 | 9 | 3 |
其中 A B C D 是类别,值在 [1, 10] 范围内(某些值可能不会出现在单列中)
我想要一个数据框,每个类别都显示这些值的计数。像这样的:
| | A | B | C | D |
|----|---|----|---|---|
| 1 | 2 | 0 | 1 | 0 |
| 2 | 1 | 0 | 0 | 0 |
| 3 | 0 | 2 | 0 | 1 |
| 4 | 0 | 0 | 0 | 1 |
| 5 | 0 | 0 | 0 | 1 |
| 6 | 0 | 0 | 0 | 0 |
| 7 | 0 | 1 | 0 | 0 |
| 8 | 0 | 0 | 0 | 0 |
| 9 | 0 | 0 | 1 | 0 |
| 10 | 0 | 0 | 1 | 0 |
我尝试使用groupby
和pivot_table
,但我似乎无法理解要给出什么参数。
【问题讨论】:
相关:How to get value counts for multiple columns at once in Pandas DataFrame? 【参考方案1】: 使用pandas.Series.value_counts
适用于每一列
seaborn.heatmap
将绘制一个 DataFrame
如果提供了 Pandas DataFrame,则索引/列信息将用于标记列和行。
选项 1
import seaborn as sns
import pandas as pd
# dataframe setup
data = 'A': [1, 2, 1], 'B': [3, 3, 7], 'C': [10, 1, 9], 'D': [4, 5, 3]
df = pd.DataFrame(data)
# create a dataframe of the counts for each column
counts = df.apply(pd.value_counts)
# display(count)
A B C D
1 2.0 NaN 1.0 NaN
2 1.0 NaN NaN NaN
3 NaN 2.0 NaN 1.0
4 NaN NaN NaN 1.0
5 NaN NaN NaN 1.0
7 NaN 1.0 NaN NaN
9 NaN NaN 1.0 NaN
10 NaN NaN 1.0 NaN
# plot
sns.heatmap(counts)
选项 2
热图有多种样式选项,使用cmap
更改颜色可以改善可视化效果。
seaborn: palettes
我认为没有 .fillna(0)
的选项 1 看起来不那么忙。
# counts
counts = df.apply(pd.value_counts).fillna(0)
# plot
sns.heatmap(counts, cmap="GnBu", annot=True)
默认颜色
sns.heatmap(counts, annot=True)
【讨论】:
【参考方案2】:这是我第一次发布答案,希望是有希望的
import seaborn as sns
import pandas as pd
import numpy as np
data = 'A': [1, 2, 1], 'B': [3, 3, 7], 'C': [10, 1, 9], 'D': [4, 5, 3]
df = pd.DataFrame(data)
df1 = pd.DataFrame(data = None , index = np.arange(11),columns = df.columns)
for value in df.columns:
df1[value]= df[value].value_counts()
df1.fillna(0)
【讨论】:
【参考方案3】:# necessary imports
import pandas as pd
import numpy as np
从数据框开始:
df = pd.DataFrame('A': [1, 2, 1],
'B': [3, 3, 7],
'C': [10,1, 9],
'D': [4, 5, 3],
index=[0, 1, 2])
那么你可以这样做:
d = pd.DataFrame(0, index=np.arange(10), columns=['A','B','C','D'])
或者,更笼统地说:
d = pd.DataFrame(0, index=np.arange(10), columns=df.columns)
d
结果将具有您想要的数据框结构,但所有值都为0
。
填充数据框:
for col in df.columns:
d[col]=df[col].value_counts()
0
s 被 NaN
s 取代。让他们再次0
:
d.replace(np.nan, 0, inplace=True)
这会给你:
+----+-----+-----+-----+-----+
| | A | B | C | D |
|----+-----+-----+-----+-----|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 2 | 0 | 1 | 0 |
| 2 | 1 | 0 | 0 | 0 |
| 3 | 0 | 2 | 0 | 1 |
| 4 | 0 | 0 | 0 | 1 |
| 5 | 0 | 0 | 0 | 1 |
| 6 | 0 | 0 | 0 | 0 |
| 7 | 0 | 1 | 0 | 0 |
| 8 | 0 | 0 | 0 | 0 |
| 9 | 0 | 0 | 1 | 0 |
+----+-----+-----+-----+-----+
【讨论】:
不幸的是,我无法在 *** 中选择两个答案作为“已接受”。我也喜欢你的回答,因为它更灵活。我将他/她的答案标记为已接受,因为我发现它更完整。但是你的也很好!谢谢。 不用担心。我同意您的选择,您标记为接受的答案是应该标记为接受的答案;)以上是关于每列中每个值的计数热图的主要内容,如果未能解决你的问题,请参考以下文章