glp*_*psx 1 python group-by 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
Run Code Online (Sandbox Code Playgroud)
我需要对上面的 DataFrame 应用 4 个聚合函数,按id和分组flag。具体来说,对于每个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
Run Code Online (Sandbox Code Playgroud)
我的问题与最后两个聚合有关。我在这里搜索类似的问题,我认为我需要创建两个自定义函数并将它们应用到对象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
Run Code Online (Sandbox Code Playgroud)
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())
})
Run Code Online (Sandbox Code Playgroud)
输出:
value1 value2 value3 value4
id flag
1 A 385 16 290.416667 97.272727
2 B 270 9 82.500000 205.714286
Run Code Online (Sandbox Code Playgroud)