您的位置:首页 > 编程语言 > Python开发

python频数统计value_counts和groupby方法

2020-04-04 12:14 3155 查看

python频数统计和groupby方法

  • groupby方法
  • 频数统计

    先用字典类型的数据创建一个DataFrame,test_data

    import pandas as pd
    test_data = pd.DataFrame({
    'x1': ["a", "b", "c", "b"],
    "x2": [1, 2, 3, 4],
    "x3": [4, 3, 2, 1]
    })
    test_data

    显示结果
    😢显示效果实在是太丑了,做笔记就这么看吧

    x1 x2 x3
    0 a 1 4
    1 b 2 3
    2 c 3 2
    3 b 4 1

    可能的需求1:对DataFrame中所有的value进行频数统计

    首先频数统计的话,什么方法比较好呢,查!
    关键词:unique counts
    unique counts site::https://pandas.pydata.org
    搜索结果是:value_counts
    “Return a Series containing counts of unique values.”

    可以用这个方法的数据类型包括:SeriesGroupBy,Index,Series
    test_data的数据类型是DataFrame
    test_data.values的数据类型是array
    Series是增强版的一维数组,而test_data.values是多维的array,是不能直接生成Series的。

    array([['a', 1, 4],
    ['b', 2, 3],
    ['c', 3, 2],
    ['b', 4, 1]], dtype=object)

    所以要进行一些处理:
    melt(self[, id_vars, value_vars, var_name, …])

    Unpivot a DataFrame from wide to long format, optionally leaving identifiers set.
    melt可以unpivot DataFrame,可以选择留下列名,把所有的列混合在一起,列名作为行名,再通过DataFrame的索引方法就可以把包括values的那一列提取出来,数据类型为Series,可以用value_counts方法。

    test_data.melt()#要对全部的values进行频数统计,先将数据melt一下
    variable value
    0 x1 a
    1 x1 b
    2 x1 c
    3 x1 b
    4 x2 1
    5 x2 2
    6 x2 3
    7 x2 4
    8 x3 4
    9 x3 3
    10 x3 2
    11 x3 1
    type(test_data.melt()['value'])#melt以后的数据类型为Series,可以用Series的value_counts方法进行频数统计
    pandas.core.series.Series
    test_data.melt()['value'].value_counts()#对表里面所有的数据进行频数统计
    b    2
    4    2
    3    2
    2    2
    1    2
    c    1
    a    1
    Name: value, dtype: int64

    可能的需求2:对某一列进行频数统计

    这个就很简单了,直接取出列数据,类型是Series,用value_counts方法统计频数就好。

    test_data.x1.value_counts()#对x1列进行频数统计
    b    2
    a    1
    c    1
    Name: x1, dtype: int64

    groupby方法

    groupby方法是比较细致的分组统计方法,主要的参数是by和level
    其中by是设定标签进行group
    而level是设定通过索引的位置进行group
    groupby返回的类型是<pandas.core.groupby.generic.DataFrameGroupBy>
    有很多的方法可以使用,比如count, cumsum, sum, size 等。

    test_data.groupby(by='x1').count()#通过x1对数据进行分组统计
    x2 x3
    x1
    a 1 1
    b 2 2
    c 1 1
    test_data.groupby(by='x1').sum()#通过x1对数据进行分组求和
    x2 x3
    x1
    a 1 4
    b 6 4
    c 3 2
    test_data.groupby(by='x1').size()#通过x1对数据进行分组,查看分组size
    x1
    a    1
    b    2
    c    1
    dtype: int64
    test_data.groupby(by=['x1', 'x2']).count()#先按x1分组,再按x2分组
    x3
    x1 x2
    a 1 1
    b 2 1
    4 1
    c 3 1
    test_data.groupby(by=['x2', 'x1']).count()#先按x2分组,再按x1分组
    x3
    x2 x1
    1 a 1
    2 b 1
    3 c 1
    4 b 1
    b = test_data.groupby(by=['x1', 'x2']).count()#b现在有multiIndex,可以试试level参数
    b.groupby(level=0).count()#level=0,按最外层的index分组
    x3
    x1
    a 1
    b 2
    c 1
    b.groupby(level=1).count()#level=1,按往里一层index分组
    x3
    x2
    1 1
    2 1
    3 1
    4 1
    b.groupby(level=-1).count()#index的index也可以反着来
    x3
    x2
    1 1
    2 1
    3 1
    4 1
    • 点赞
    • 收藏
    • 分享
    • 文章举报
    红泥小火炉儿 发布了5 篇原创文章 · 获赞 0 · 访问量 193 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: