Python 每列中每个值的计数热图
我有这样一个数据帧:Python 每列中每个值的计数热图,python,pandas,dataframe,pivot-table,Python,Pandas,Dataframe,Pivot Table,我有这样一个数据帧: | A | B | C | D | |---|---|----|---| | 1 | 3 | 10 | 4 | | 2 | 3 | 1 | 5 | | 1 | 7 | 9 | 3 | | | A | B | C | D | |----|---|----|---|---| | 1 | 2 | 0 | 1 | 0 | | 2 | 1 | 0 | 0 | 0 | | 3 | 0 | 2 | 0 | 1 | | 4 | 0 |
| A | B | C | D |
|---|---|----|---|
| 1 | 3 | 10 | 4 |
| 2 | 3 | 1 | 5 |
| 1 | 7 | 9 | 3 |
| | 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 |
其中,B C D为类别,且值在[1,10]范围内(某些值可能不会出现在单个列中)
我希望有一个数据框,每个类别显示这些值的计数。大概是这样的:
| A | B | C | D |
|---|---|----|---|
| 1 | 3 | 10 | 4 |
| 2 | 3 | 1 | 5 |
| 1 | 7 | 9 | 3 |
| | 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\u表
,但我似乎不明白应该给出什么参数。- 使用适用于每列
- 将绘制一个
DataFrame
- 如果提供了数据帧,索引/列信息将用于标记列和行
导入seaborn作为sns
作为pd进口熊猫
#数据帧设置
数据={'A':[1,2,1],'B':[3,3,7],'C':[10,1,9],'D':[4,5,3]}
df=pd.DataFrame(数据)
#为每列创建计数的数据帧
计数=df.apply(pd.value\U计数)
#显示(计数)
A、B、C、D
1 2.0 NaN 1.0 NaN
2 1.0楠楠
3 NaN 2.0 NaN 1.0
4南1.0
5南1.0
7楠1.0楠楠
9楠楠1.0楠楠
10纳南1.0纳南
#密谋
sns.热图(计数)
选择2
- 热图有许多样式选项可用,使用
更改颜色可以提高可视化效果。cmap
- 我认为选项1没有
看起来不那么忙。fillna(0)
#计数
计数=df.apply(pd.value\U计数)。fillna(0)
#密谋
sns.heatmap(计数,cmap=“GnBu”,annot=True)
默认颜色
sns.heatmap(计数,annot=True)
从数据帧开始:
df = pd.DataFrame({'A': [1, 2, 1],
'B': [3, 3, 7],
'C': [10,1, 9],
'D': [4, 5, 3]},
index=[0, 1, 2])
for col in df.columns:
d[col]=df[col].value_counts()
然后你可以做:
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
填充数据框:
df = pd.DataFrame({'A': [1, 2, 1],
'B': [3, 3, 7],
'C': [10,1, 9],
'D': [4, 5, 3]},
index=[0, 1, 2])
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 |
+----+-----+-----+-----+-----+
这是我第一次发布答案,希望是有希望的
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)
相关:很遗憾,我无法在stackoverflow中选择两个答案为“已接受”。我也喜欢你的答案,因为它更灵活。我认为他/她的回答更完整,所以我将其标记为接受。但是你的也很好!谢谢,不用担心。我同意您的选择,您标记为已接受的答案是应该标记为已接受的答案;)