【问题标题】:Plot histogram for feature of array with known and limited values绘制具有已知值和有限值的数组特征的直方图
【发布时间】:2019-04-04 05:33:38
【问题描述】:

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

["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】:

    我相信您需要扁平化值,然后 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()
    

    【讨论】:

    • 谢谢!这非常适合绘制直方图!然而,我希望稍后使用这些条目来查找与其他列的相关性,因此在这种情况下将它们放在原始数据框中是必要的。
    • @Jes - ast.literal_eval 是必要的吗?
    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 2017-03-09
    • 2020-02-18
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2021-06-17
    • 2017-11-15
    相关资源
    最近更新 更多