绘制具有已知值和有限值的数组特征的直方图

问题描述 投票:2回答:1

我的数据框中一个名为“pets”的列基本上是宠物列表的一个特征:

["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
python pandas dataframe matplotlib
1个回答
0
投票

我相信你需要展平价值,然后Series.value_countsSeries.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()
© www.soinside.com 2019 - 2024. All rights reserved.