假设我们有一个 DataFrame,它包含了不同城市的天气数据:
import pandas as pd
data = {
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Beijing', 'Shanghai', 'Guangzhou'],
'temperature': [15, 20, 25, 10, 18, 22],
'humidity': [30, 45, 60, 35, 50, 55]
}
df = pd.DataFrame(data)
这个 DataFrame 的内容如下:
city | temperature | humidity | |
---|---|---|---|
0 | Beijing | 15 | 30 |
1 | Shanghai | 20 | 45 |
2 | Guangzhou | 25 | 60 |
3 | Beijing | 10 | 35 |
4 | Shanghai | 18 | 50 |
5 | Guangzhou | 22 | 55 |
现在,我们想要计算每个城市的平均温度和湿度。我们可以使用 groupby
函数来实现这个需求:
df_grouped = df.groupby('city').mean()
这段代码首先使用 groupby('city')
将 DataFrame 按照 ‘city’ 列的值进行分组,然后使用 mean()
计算每一组的平均值。结果是一个新的 DataFrame,其索引是 ‘city’ 列的唯一值,每一行是对应城市的平均温度和湿度。
这个新的 DataFrame df_grouped
的内容如下:
city | temperature | humidity |
---|---|---|
Beijing | 12.5 | 32.5 |
Guangzhou | 23.5 | 57.5 |
Shanghai | 19.0 | 47.5 |
可以看到,通常用法是将dataframe按照一列/多列进行分组后,对剩余的列聚合
如果剩余的列并不能同时做同一种操作呢?有2种方案,一是先选出目标列,在分组计算,如df_grouped = df[[‘…’ , ’…’ , …]].groupby(‘city’).mean(),另一种则是第2种用法
首先,我们创建一个 DataFrame,然后按 ‘unit’ 列分组并对 ‘qty’ 列进行差分。以下是相应的代码:
import pandas as pd
# 创建 DataFrame
data = {
'unit': ['A', 'A', 'A', 'B', 'B', 'B'],
'ts': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-01', '2022-01-02', '2022-01-03'],
'qty': [10, 15, 20, 5, 10, 15]
}
df = pd.DataFrame(data)
# 按 'unit' 列分组并对 'qty' 列进行差分
df['qty_diff'] = df.groupby('unit')['qty'].diff()
# 或者
df['qty_diff'] = df['qty'].groupby(df['unit']).diff()
unit | ts | qty | |
---|---|---|---|
0 | A | 2022-01-01 | 10 |
1 | A | 2022-01-02 | 15 |
2 | A | 2022-01-03 | 20 |
3 | B | 2022-01-01 | 5 |
4 | B | 2022-01-02 | 10 |
5 | B | 2022-01-03 | 15 |
在这段代码中,我们首先创建了一个 DataFrame df
。
直接分组差分,会因为ts无法做减法而出错,
因此我们使用 groupby('unit')
将 DataFrame 按照 ‘unit’ 列的值进行分组,然后使用 diff()
对每一组的 ‘qty’ 列进行差分。差分的结果被存储在新的列 ‘qty_diff’ 中。
以上2种写法的等价的,可以先分组再选列,也可以先选列再分组,只是注意groupby里的参数会有点不同
会得到以下的输出 DataFrame:
unit | ts | qty | |
---|---|---|---|
0 | A | 2022-01-01 | NaN |
1 | A | 2022-01-02 | 5 |
2 | A | 2022-01-03 | 5 |
3 | B | 2022-01-01 | NaN |
4 | B | 2022-01-02 | 5 |
5 | B | 2022-01-03 | 5 |