python频数统计value_counts和groupby方法

python频数统计和groupby方法

  • 频数统计
    • 可能的需求1:对DataFrame中所有的value进行频数统计
    • 可能的需求2:对某一列进行频数统计
  • 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返回的类型是
有很多的方法可以使用,比如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

你可能感兴趣的:(python频数统计value_counts和groupby方法)