在我的数据框中,称为“宠物”的列基本上是宠物列表的一项功能:
["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
答案 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.stack
和DataFrame.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()