每列中每个值的计数热图

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 | 

我尝试使用groupbypivot_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()

0s 被 NaNs 取代。让他们再次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 |
+----+-----+-----+-----+-----+

【讨论】:

不幸的是,我无法在 *** 中选择两个答案作为“已接受”。我也喜欢你的回答,因为它更灵活。我将他/她的答案标记为已接受,因为我发现它更完整。但是你的也很好!谢谢。 不用担心。我同意您的选择,您标记为接受的答案是应该标记为接受的答案;)

以上是关于每列中每个值的计数热图的主要内容,如果未能解决你的问题,请参考以下文章

我的表有多个列,我想获取每列中的值计数并在 postgresql 中分别显示每列的计数值

如何获取列中每个值的计数?

如何获取列中每个不同值的计数? [复制]

如何使用 Linq 获取列中每个不同值的计数

如何将熊猫数据框中每列中唯一值的数量绘制为条形图?

获取bash中列中唯一值的计数