我的数据框df有两列customer1
和customer2
,它们是字符串值。我想从这两列中为每对的计数编号做一个方形图形表示。
我能做到
df[['customer1', 'customer2']].value_counts()
这将给我计数。但是我怎样才能做出看起来有点像的东西:
从结果?
我无法提供我的真实数据集,但这里是一个在csv中有三个标签的玩具示例。
customer1,customer2
a,b
a,c
a,c
b,a
b,c
b,c
c,c
a,a
b,c
b,c
答案 0 :(得分:2)
更新:
是否可以对行/列进行排序,以便计算最高行数 在顶部 ?在这种情况下,订单将是b,a,c
IIUC你可以这样做(在哪里):
In [80]: x = df.pivot_table(index='customer1',columns='customer2',aggfunc='size',fill_value=0)
In [81]: idx = x.max(axis=1).sort_values(ascending=0).index
In [82]: idx
Out[82]: Index(['b', 'a', 'c'], dtype='object', name='customer1')
In [87]: sns.heatmap(x[idx].reindex(idx), annot=True)
Out[87]: <matplotlib.axes._subplots.AxesSubplot at 0x9ee3f98>
OLD回答:
您可以使用seaborn
模块中的heatmap()方法:
In [42]: import seaborn as sns
In [43]: df
Out[43]:
customer1 customer2
0 a b
1 a c
2 a c
3 b a
4 b c
5 b c
6 c c
7 a a
8 b c
9 b c
In [44]: x = df.pivot_table(index='customer1',columns='customer2',aggfunc='size',fill_value=0)
In [45]: x
Out[45]:
customer2 a b c
customer1
a 1 1 2
b 1 0 4
c 0 0 1
In [46]: sns.heatmap(x)
Out[46]: <matplotlib.axes._subplots.AxesSubplot at 0xb150b70>
或带注释:
In [48]: sns.heatmap(x, annot=True)
Out[48]: <matplotlib.axes._subplots.AxesSubplot at 0xc596d68>
答案 1 :(得分:0)
正如@MaxU所提到的,seaborn.heatmap
应该有效。您似乎可以使用Pandas DataFrame作为输入。
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, ax=None, xticklabels=True, yticklabels=True, mask=None, **kwargs)
https://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.heatmap.html#seaborn.heatmap