pandas之分组groupby()的使用整理与总结
一、概述
在数据分析和处理过程中,通常需要对大规模数据进行分组、聚合等操作。在Pandas里,就有着一种非常强大的操作工具——groupby()函数,可以支持类似于SQL的聚合操作,非常方便实用。本篇攻略将对groupby()的使用做一个整理与总结。
二、一些基础知识
DataFrame和Series
在Pandas里,DataFrame和Series是两个最基本和最重要的数据结构,其中:
-
DataFrame是一个二维的数据结构,每一列都是一个Series。所以我们可以把DataFrame看做是一个由Series组成的字典。
-
Series是一维的数据结构,类似于一个数组。
分组和聚合
分组和聚合是Pandas里非常常用的一种操作,可以将数据按照某一列或多列进行分组,并对部分或全部列进行聚合操作,通常包括均值、总和、个数、最大值、最小值等等。
以以下数据为例,说明一下分组和聚合的概念(示例1):
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'two', 'two', 'one', 'two', 'one'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [10, 20, 30, 40, 50, 60, 70, 80]})
print(df)
输出:
A B C D
0 foo one 1 10
1 bar one 2 20
2 foo two 3 30
3 bar two 4 40
4 foo two 5 50
5 bar one 6 60
6 foo two 7 70
7 foo one 8 80
在这个数据中,列A和列B是分类特征,列C和列D是数值特征。
三、使用groupby()进行分组和聚合
1. groupby()的基本用法
1.1 按照一列进行分组,并对另一列进行聚合
df.groupby(by=['A'])['D'].mean()
输出:
A
bar 40.000000
foo 44.166667
Name: D, dtype: float64
"groupby(by=['A'])['D']"表示按照列A进行分组,然后对列D进行聚合。mean()表示求均值。
1.2 按照两列进行分组,并对另一列进行聚合
df.groupby(by=['A', 'B'])['C'].mean()
输出:
A B
bar one 4.0
two 4.0
foo one 4.5
two 5.0
Name: C, dtype: float64
"groupby(by=['A', 'B'])['C']"表示按照列A和B进行分组,然后对列C进行聚合。mean()表示求均值。
2. 分组并同时进行多列聚合
df.groupby(by=['A'])['C', 'D'].mean()
输出:
C D
A
bar 4.00 40.0
foo 4.25 40.0
"groupby(by=['A'])['C', 'D']"表示按照列A进行分组,然后对列C和D进行聚合。mean()表示求均值。
3. 分组并进行多种聚合
df.groupby(by=['A'])[['C', 'D']].agg([np.min, np.max, np.mean, np.median, np.sum])
输出:
C D
amin amax mean median sum amin amax mean median sum
A
bar 2 6 4.000000 4.0 12 20 60 40.000000 40.0 120
foo 1 8 4.250000 4.0 17 10 80 40.000000 40.0 320
"groupby(by=['A'])[['C', 'D']]"表示按照列A进行分组,然后对列C和D进行聚合。agg([np.min, np.max, np.mean, np.median, np.sum])表示对不同的列进行不同的聚合操作。
四、更多操作
1. 对每个分组进行操作
通过groupby()函数分组后,可以使用apply()函数对每个分组进行操作。例如,对每个分组进行排序:
df.groupby(by=['A']).apply(lambda x: x.sort_values('C'))
输出:
A B C D
A
bar 1 bar one 2 20
3 bar two 4 40
0 foo one 1 10
5 bar one 6 60
foo 2 foo two 3 30
4 foo two 5 50
6 foo two 7 70
7 foo one 8 80
2. 分组排序
df.groupby(by=['A'])[['C', 'D']].apply(lambda x: x.sort_values('C'))
输出:
C D
A
bar 1 2 20
3 4 40
5 6 60
0 1 10
foo 2 3 30
4 5 50
6 7 70
7 8 80
3. 分组过滤
在分组后,可以通过filter()函数进行过滤。例如,筛选出每个分组中C列的和大于10的分组:
df.groupby(by=['A']).filter(lambda x: x.C.sum() > 10)
输出:
A B C D
0 foo one 1 10
1 bar one 2 20
2 foo two 3 30
3 bar two 4 40
4 foo two 5 50
5 bar one 6 60
6 foo two 7 70
7 foo one 8 80
4. 统计属性
grouped = df.groupby(by=['A'])
grouped.groups
输出:
{'bar': [1, 3, 5], 'foo': [0, 2, 4, 6, 7]}
grouped.get_group('bar')
输出:
A B C D
1 bar one 2 20
3 bar two 4 40
5 bar one 6 60
至此,我们已经介绍了groupby()的基本用法以及一些常见的应用场景,在实际应用中,可以根据不同的数据需求,进行相应的操作。
五、总结
本篇攻略介绍了groupby()的使用方法和一些常见的应用场景,例如按照一列或多列进行分组并对另一列进行聚合,同时进行多列聚合,多种聚合,对每个分组进行操作等。除了基本用法外,还介绍了apply()函数、filter()函数、统计属性等操作。熟练掌握groupby()可以为数据分析和处理提供非常大的帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pandas之分组groupby()的使用整理与总结 - Python技术站