计算值在数据帧列中出现的频率

 卫凤莉_463 发布于 2023-01-18 11:08

我有一个数据集

|category|
cat a
cat b
cat a

我希望能够返回类似的东西(显示独特的值和频率)

category | freq |
cat a       2
cat b       1

EdChum - Rei.. 346

使用groupbycount:

In [37]:
df = pd.DataFrame({'a':list('abssbab')})
df.groupby('a').count()

Out[37]:

   a
a   
a  2
b  3
s  2

[3 rows x 1 columns]

请参阅在线文档:http://pandas.pydata.org/pandas-docs/stable/groupby.html

同样value_counts()正如@DSM评论的那样,有许多方法可以让猫在这里

In [38]:
df['a'].value_counts()

Out[38]:

b    3
a    2
s    2
dtype: int64

如果要将频率添加回原始数据帧,请使用transform以返回对齐的索引:

In [41]:
df['freq'] = df.groupby('a')['a'].transform('count')
df

Out[41]:

   a freq
0  a    2
1  b    3
2  s    2
3  s    2
4  b    3
5  a    2
6  b    3

[7 rows x 2 columns]

在你的第一个代码示例中,df按预期分配,但是这一行:df.groupby('a').count()返回一个空数据帧.这个答案是否可能与熊猫0.18.1过时了?此外,您的列名"a"与您搜索"a"的值相同,这有点令人困惑.我会自己编辑,但由于代码对我不起作用,我不能确定我的编辑. (4认同)


Arran Cudbar.. 82

如果要应用于所有列,可以使用:

df.apply(pd.value_counts)

这将对每个列应用基于列的聚合函数(在本例中为value_counts).

7 个回答
  • df.category.value_counts()
    

    这一小段代码将为您提供所需的输出.

    如果您的列名称包含空格,则可以使用

    df['category'].value_counts()
    

    2023-01-18 11:09 回答
  • 对df中的多个列使用list comprehension和value_counts

    [my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
    

    /sf/ask/17360801/

    2023-01-18 11:09 回答
  • 在0.18.1 groupby连同count不给唯一值的频率:

    >>> df
       a
    0  a
    1  b
    2  s
    3  s
    4  b
    5  a
    6  b
    
    >>> df.groupby('a').count()
    Empty DataFrame
    Columns: []
    Index: [a, b, s]
    

    但是,使用size以下方法可以轻松确定唯一值及其频率:

    >>> df.groupby('a').size()
    a
    a    2
    b    3
    s    2
    

    对于df.a.value_counts()排序值(按降序排列,即最大值为第一个),默认返回.

    2023-01-18 11:09 回答
  • 如果您的DataFrame具有相同类型的值,则还可以return_counts=True在numpy.unique()中进行设置。

    index, counts = np.unique(df.values,return_counts=True)

    如果您的值是整数,则np.bincount()可能会更快。

    2023-01-18 11:09 回答
  • df.apply(pd.value_counts).fillna(0)
    

    value_counts - 返回包含唯一值计数的对象

    apply - 计算每列的频率.如果设置axis = 1,则每行都会获得频率

    fillna(0) - 使输出更加花哨.将NaN更改为0

    2023-01-18 11:10 回答
  • 使用groupbycount:

    In [37]:
    df = pd.DataFrame({'a':list('abssbab')})
    df.groupby('a').count()
    
    Out[37]:
    
       a
    a   
    a  2
    b  3
    s  2
    
    [3 rows x 1 columns]
    

    请参阅在线文档:http://pandas.pydata.org/pandas-docs/stable/groupby.html

    同样value_counts()正如@DSM评论的那样,有许多方法可以让猫在这里

    In [38]:
    df['a'].value_counts()
    
    Out[38]:
    
    b    3
    a    2
    s    2
    dtype: int64
    

    如果要将频率添加回原始数据帧,请使用transform以返回对齐的索引:

    In [41]:
    df['freq'] = df.groupby('a')['a'].transform('count')
    df
    
    Out[41]:
    
       a freq
    0  a    2
    1  b    3
    2  s    2
    3  s    2
    4  b    3
    5  a    2
    6  b    3
    
    [7 rows x 2 columns]
    

    2023-01-18 11:10 回答
  • 如果要应用于所有列,可以使用:

    df.apply(pd.value_counts)
    

    这将对每个列应用基于列的聚合函数(在本例中为value_counts).

    2023-01-18 11:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有