python-3.x - Groupby多列并计算Pandas中总和的百分比
问题描述
df
给定如下数据集:
type module item value input
0 A a item1 2 1
1 A a item2 3 0
2 A aa item3 4 1
3 A aa item4 3 0
4 A aa item5 1 -1
5 B b item1 5 0
6 B b item2 1 -1
7 B bb item3 3 0
8 B bb item4 3 1
9 B bb item5 4 0
我需要根据以下逻辑进行计算:首先,我们只取sum
who is or作为有效值。然后我需要 groupby来计算总和的百分比,例如,第一行的由 计算,由计算,而不是除以,因为输入值是所以它被排除在外。中的列由 groupby然后 sum of计算。pct
value
input
0
1
type, module
pct
A-a-item1
2/(2 + 3) = 0.4
A-aa-item1
4/(4 + 3) = 0.57
8
A-aa-item3
-1
sum
df2
type module
sum
df1:
type module item value input pct
0 A a item1 2 1 0.400000
1 A a item2 3 0 0.000000
2 A aa item1 4 1 0.571429
3 A aa item2 3 0 0.000000
4 A aa item3 1 -1 0.000000
5 B b item1 5 0 0.000000
6 B b item2 1 -1 0.000000
7 B bb item1 3 0 0.000000
8 B bb item2 3 1 0.300000
9 B bb item3 4 0 0.000000
df2:
type module sum
0 A a 0.40
1 A aa 0.57
2 B b 0.00
3 B bb 0.30
如何根据给定的数据集获得类似的结果?谢谢。
解决方案
您可以将不匹配条件替换Series.eq
为 for compare by 1
with0
和 compare by 0, 1
by Series.isin
and 聚合用于由聚合值GroupBy.transform
填充sum
并除以的新列Series.div
:
s1 = df['value'].where(df['input'].eq(1), 0)
s2 = (df.assign(value = df['value'].where(df['input'].isin([0,1]), 0))
.groupby(['type','module'])['value'].transform('sum'))
df['pct '] = s1.div(s2)
print (df)
type module item value input pct
0 A a item1 2 1 0.400000
1 A a item2 3 0 0.000000
2 A aa item3 4 1 0.571429
3 A aa item4 3 0 0.000000
4 A aa item5 1 -1 0.000000
5 B b item1 5 0 0.000000
6 B b item2 1 -1 0.000000
7 B bb item3 3 0 0.000000
8 B bb item4 3 1 0.300000
9 B bb item5 4 0 0.000000
对于第二个DataFrame
添加 2 个新列DataFrame.assign
,聚合sum
和最后一个除以DataFrame.pop
使用和删除列value
:
df2 = (df.assign(value = df['value'].where(df['input'].isin([0,1]), 0),
pct = df['value'].where(df['input'].eq(1), 0))
.groupby(['type','module'])[['value','pct']]
.sum()
.assign(pct = lambda x: x['pct'].div(x.pop('value')))
.reset_index())
print (df2)
type module pct
0 A a 0.400000
1 A aa 0.571429
2 B b 0.000000
3 B bb 0.300000
推荐阅读
- c++ - C++ 虚拟高尔顿板
- java - Cucumber JUnit是否可以用于UnitTest Spring?
- android - Jenkins 模块依赖
- python - 如何仅在特定位置使用 scipy 执行卷积?
- dart - Isolate.spawnUri 当前在消息中包含 SendPort 时会导致错误?
- python - dataset.repeat() 在 TensorFlow 中不起作用
- javascript - 仅将许多对象插入到一个画布中
- api - JMSSerializer Bundle - 循环引用错误(仅在 Prod Azure 环境中) - Symfony4/Doctrine2 REST API
- linux - 块设备(emmc 分区)是否有文件结束标记?
- sql - 尝试创建二进制标志时 SQL case 语句出错?