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()
|
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'])
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()
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()
|
x2 |
x3 |
x1 |
|
|
a |
1 |
1 |
b |
2 |
2 |
c |
1 |
1 |
test_data.groupby(by='x1').sum()
|
x2 |
x3 |
x1 |
|
|
a |
1 |
4 |
b |
6 |
4 |
c |
3 |
2 |
test_data.groupby(by='x1').size()
x1
a 1
b 2
c 1
dtype: int64
test_data.groupby(by=['x1', 'x2']).count()
|
|
x3 |
x1 |
x2 |
|
a |
1 |
1 |
b |
2 |
1 |
4 |
1 |
c |
3 |
1 |
test_data.groupby(by=['x2', 'x1']).count()
|
|
x3 |
x2 |
x1 |
|
1 |
a |
1 |
2 |
b |
1 |
3 |
c |
1 |
4 |
b |
1 |
b = test_data.groupby(by=['x1', 'x2']).count()
b.groupby(level=0).count()
b.groupby(level=1).count()
b.groupby(level=-1).count()