Pandas groupby 并跨行应用聚合函数
Pandas groupby and apply aggregate function across rows
我在 pandas 中将海关功能应用于 groupby
操作时遇到困难。假设我有以下 DataFrame 可以使用:
import pandas as pd
df = pd.DataFrame(
{
"id": [1, 1, 2, 2],
"flag": ["A", "A", "B", "B"],
"value1": [520, 250, 180, 360],
"value2": [11, 5, 7, 2],
}
)
print(df)
id flag value1 value2
0 1 A 520 11
1 1 A 250 5
2 2 B 180 7
3 2 B 360 2
我需要对按 id
和 flag
分组的上述 DataFrame 应用 4 个聚合函数。具体来说,对于每个 id
和 flag
:
- 计算
value1
的平均值;
- 计算
value2
的总和;
- 计算
(value1 * value2) / 12
的平均值;
- 计算
(value1 / value2)
的总和。
我对前两个没有任何问题。这就是我计算它们的方法:
df.groupby(["id", "flag"]).agg({"value1": ["mean"], "value2": ["sum"]})
value1 value2
mean sum
id flag
1 A 385.0 16
2 B 270.0 9
我的问题与最后两个聚合有关。我在这里搜索类似的问题,我想我需要创建两个自定义函数并将它们应用于 groupby
对象。不幸的是,我所有的尝试都失败了,我无法解决这个问题。另外,如果可能的话,我希望所有结果都在一个 DataFrame 中,如下所示(希望我已经正确计算了数字):
value1 value2
mean sum func1 func2
id flag
1 A 385.0 16 290.42 97.27
2 B 270.0 9 82.5 205.71
groupby().agg.
只接受一列的值。
对于涉及多个列的自定义函数,我会这样做:
groupby = df.groupby(['id','flag'])
out = pd.DataFrame({
'value1': groupby['value1'].mean(),
'value2': groupby['value2'].sum(),
'value3': groupby.apply(lambda x: (x['value1'] * x['value2']).mean()/12),
'value4': groupby.apply(lambda x: (x['value1']/x['value2']).sum())
})
输出:
value1 value2 value3 value4
id flag
1 A 385 16 290.416667 97.272727
2 B 270 9 82.500000 205.714286
在这种情况下我要做的是在临时列中存储 (value1 * value2) / 12
和 (value1 / value2)
,然后聚合:
agg_funcs = {
'value1': 'mean',
'value2': 'sum',
'func1': 'mean',
'func2': 'sum',
}
agg = (
df.assign(
func1=lambda x: (x['value1'] * x['value2']) / 12,
func2=lambda x: (x['value1'] / x['value2'])
)
.groupby(["id", "flag"])
.agg(agg_funcs)
)
输出:
>>> agg
value1 value2 func1 func2
id flag
1 A 385.0 16 290.416667 97.272727
2 B 270.0 9 82.500000 205.714286
必填项one-liner:
df.assign(func1=lambda x: (x.value1 * x.value2) / 12, func2=lambda x: (x.value1 / x.value2)).groupby(["id","flag"]).agg({'value1': 'mean', 'value2': 'sum', 'func1': 'mean', 'func2': 'sum'})
我在 pandas 中将海关功能应用于 groupby
操作时遇到困难。假设我有以下 DataFrame 可以使用:
import pandas as pd
df = pd.DataFrame(
{
"id": [1, 1, 2, 2],
"flag": ["A", "A", "B", "B"],
"value1": [520, 250, 180, 360],
"value2": [11, 5, 7, 2],
}
)
print(df)
id flag value1 value2
0 1 A 520 11
1 1 A 250 5
2 2 B 180 7
3 2 B 360 2
我需要对按 id
和 flag
分组的上述 DataFrame 应用 4 个聚合函数。具体来说,对于每个 id
和 flag
:
- 计算
value1
的平均值; - 计算
value2
的总和; - 计算
(value1 * value2) / 12
的平均值; - 计算
(value1 / value2)
的总和。
我对前两个没有任何问题。这就是我计算它们的方法:
df.groupby(["id", "flag"]).agg({"value1": ["mean"], "value2": ["sum"]})
value1 value2
mean sum
id flag
1 A 385.0 16
2 B 270.0 9
我的问题与最后两个聚合有关。我在这里搜索类似的问题,我想我需要创建两个自定义函数并将它们应用于 groupby
对象。不幸的是,我所有的尝试都失败了,我无法解决这个问题。另外,如果可能的话,我希望所有结果都在一个 DataFrame 中,如下所示(希望我已经正确计算了数字):
value1 value2
mean sum func1 func2
id flag
1 A 385.0 16 290.42 97.27
2 B 270.0 9 82.5 205.71
groupby().agg.
只接受一列的值。
对于涉及多个列的自定义函数,我会这样做:
groupby = df.groupby(['id','flag'])
out = pd.DataFrame({
'value1': groupby['value1'].mean(),
'value2': groupby['value2'].sum(),
'value3': groupby.apply(lambda x: (x['value1'] * x['value2']).mean()/12),
'value4': groupby.apply(lambda x: (x['value1']/x['value2']).sum())
})
输出:
value1 value2 value3 value4
id flag
1 A 385 16 290.416667 97.272727
2 B 270 9 82.500000 205.714286
在这种情况下我要做的是在临时列中存储 (value1 * value2) / 12
和 (value1 / value2)
,然后聚合:
agg_funcs = {
'value1': 'mean',
'value2': 'sum',
'func1': 'mean',
'func2': 'sum',
}
agg = (
df.assign(
func1=lambda x: (x['value1'] * x['value2']) / 12,
func2=lambda x: (x['value1'] / x['value2'])
)
.groupby(["id", "flag"])
.agg(agg_funcs)
)
输出:
>>> agg
value1 value2 func1 func2
id flag
1 A 385.0 16 290.416667 97.272727
2 B 270.0 9 82.500000 205.714286
必填项one-liner:
df.assign(func1=lambda x: (x.value1 * x.value2) / 12, func2=lambda x: (x.value1 / x.value2)).groupby(["id","flag"]).agg({'value1': 'mean', 'value2': 'sum', 'func1': 'mean', 'func2': 'sum'})