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分组
b.groupby(level=1).count()#level=1,按往里一层index分组
b.groupby(level=-1).count()#index的index也可以反着来
红泥小火炉儿
发布了5 篇原创文章 · 获赞 0 · 访问量 193
私信
关注