groupby深层次运用
时间: 2023-08-28 20:04:55 浏览: 41
`groupby` 是 pandas 中一个非常有用的函数,它允许我们将数据按照一定的条件进行分组,并对每个分组进行操作。下面介绍几种 `groupby` 的深层次运用。
1. 多列分组
我们可以根据多列的值对数据进行分组,此时返回的是一个多层次索引(MultiIndex)的数据框。例如,我们有以下的数据框:
```python
import pandas as pd
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [10, 20, 30, 40, 50, 60, 70, 80]
})
```
我们可以按照 `A` 和 `B` 两列进行分组:
```python
grouped = df.groupby(['A', 'B'])
```
这样我们就得到了一个多层次索引的数据框,其中第一层索引为 `A` 的不同取值,第二层索引为 `B` 的不同取值。我们可以通过以下的方式访问分组:
```python
for name, group in grouped:
print(name)
print(group)
```
其中 `name` 是一个元组,代表了当前分组的值,`group` 是一个数据框,代表了当前分组的数据。
2. 自定义函数分组
除了按照列的值进行分组,我们还可以自定义函数来进行分组。例如,我们有以下的数据框:
```python
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [10, 20, 30, 40, 50, 60, 70, 80]
})
```
我们可以定义一个函数,根据 `C` 列的奇偶性来进行分组:
```python
def odd_even(x):
if x % 2 == 0:
return 'even'
else:
return 'odd'
grouped = df.groupby(odd_even)
```
这样我们就得到了一个按照 `C` 列奇偶性分组的数据框。同样可以通过以下的方式访问分组:
```python
for name, group in grouped:
print(name)
print(group)
```
3. 聚合操作
`groupby` 还可以进行聚合操作,例如对每个分组的 `D` 列求和:
```python
grouped = df.groupby('A')
grouped['D'].sum()
```
这样会返回一个以 `A` 列分组的数据框,其中包含每个分组的 `D` 列的和。
除了求和,`groupby` 还支持多种聚合操作,例如求平均值 `mean()`、最小值 `min()`、最大值 `max()`、中位数 `median()` 等等。此外,我们还可以自定义聚合函数来对每个分组进行操作。例如,我们可以自定义一个函数 `my_agg`,返回每个分组 `D` 列的总和和平均值:
```python
def my_agg(x):
return pd.Series({
'D_sum': x['D'].sum(),
'D_mean': x['D'].mean()
})
grouped = df.groupby('A')
grouped.apply(my_agg)
```
这样会返回一个以 `A` 列分组的数据框,其中包含每个分组 `D` 列的总和和平均值。