用已知和有限值绘制阵列特征的直方图

时间:2019-04-04 05:33:38

标签: python pandas dataframe matplotlib

在我的数据框中,称为“宠物”的列基本上是宠物列表的一项功能:

["dog"]  
["dog", "cat"]  
["cat", "parrot"]  
["dog", "cat", "fish"]  

可能的宠物:["dog", "cat", "parrot", "fish"]

我想绘制列的直方图,以便为每个宠物计算一个特征值列表中的每个宠物。
在这种情况下:

#dog = 3  
#cat = 2  
#parrot = 1  
#fish = 1  

如何完成?

我认为可以将特征展平为4个布尔特征,然后绘制这些特征,但是这似乎不是“正确的”解决方案。

df['pets'].head()
--
0   ["dog"]  
1   ["dog", "cat"]  
2   ["cat", "parrot"]  
3   ["dog", "cat", "fish"]  
Name: pets, dtype: object

我希望直方图中的每一列都对所有宠物计数,以便直方图的总大小(高度/数量之和)可以大于条目数(在上面的示例中,有4个条目,但直方图的大小应为1 + 2 + 2 + 3 = 8


编辑:是否可以重复某些条目,或者将这些条目展平以获得单值功能? 例如,以上内容将变成:

df['pets'].head()
--
0   "dog"  
1   "dog"
2   "cat"  
3   "cat"  
4   "parrot"    
5   "dog"  
6   "cat"  
7   "fish"  
Name: pets, dtype: object

1 个答案:

答案 0 :(得分:0)

我认为您需要取整平值,然后Series.value_counts并按Series.plot.bar进行绘制:

import ast

s = pd.Series([z for y in df['col'] for z in y])
#if necessary convert to lists from strings 
#s = pd.Series([z for y in df['col'] for z in ast.literal_eval(y)])
print (s)
0       dog
1       dog
2       cat
3       cat
4    parrot
5       dog
6       cat
7      fish
dtype: object

s.value_counts().plot.bar()

编辑:如果有多个列,则需要重复其他列的值,因此首先创建DataFrame,将DataFrame.stackDataFrame.join重塑为原始形状:

print (df)
                       col   A
0                  ["dog"]   3
1          ["dog", "cat"]    7
2        ["cat", "parrot"]  10
3  ["dog", "cat", "fish"]    2

import ast

a = (pd.DataFrame(df.pop('col').apply(ast.literal_eval).values.tolist())
       .stack()
       .reset_index(level=1, drop=True)
       .rename('col'))
print (a)

0       dog
1       dog
1       cat
2       cat
2    parrot
3       dog
3       cat
3      fish
Name: col, dtype: object

df = df.join(a).reset_index(drop=True)
print (df)
    A     col
0   3     dog
1   7     dog
2   7     cat
3  10     cat
4  10  parrot
5   2     dog
6   2     cat
7   2    fish

然后可以使用:

df['col'].value_counts().plot.bar()