python - 熊猫根据条件按行选择分组
问题描述
我需要根据条件选择 pandas 组中的行。
Condition1 # 对于给定的组 R1,R2,W,如果 TYPE(A) amount2 等于 TYPE(B) 行,我们需要将完整的 TYPE(A) 行作为输出。
Condition2 # 对于给定的组 R1,R2,W,如果 TYPE(A) row amount2 不等于 TYPE(B) row amount2 ,我们需要将 TYPE (A) & (B) rows &我们需要将 TYPE(A) 行中的剩余列作为输出。
输入数据框
R1 R2 W TYPE amount1 amount2 Status Exchange
0 123 12 1 A 111 222 C 1.5
1 123 12 1 B 111 222 D 2.5
2 123 12 2 A 222 222 A 1.5
3 123 12 2 B 333 333 D 2.5
4 123 12 3 A 444 444 D 2.5
5 123 12 3 B 333 333 E 3.5
预期产出
R1 R2 W TYPE amount1 amount2 Status Exchange
0 123 12 1 A 111 222 C 1.5
1 123 12 2 A 555 555 A 1.5
2 123 12 3 A 777 777 D 2.5
解决方案
首先是必须通过 reshape with and来获取所有amount1
相等的组,通过with and比较选定的列以测试是否使用了所有列匹配,最后使用与原始相同的长度:amount2
DataFrame.set_index
DataFrame.unstack
DataFrame.xs
DataFrame.eq
DataFrame.all
DataFrame.merge
df1 = df.set_index(['R1','R2','W','TYPE'])['amount2'].unstack()
m = df1['A'].eq(df1['B']).rename('m')
m = df.join(m, on=['R1','R2','W'])['m']
然后对于匹配行(这里是第一组)boolean indexing
仅按位A
链接的行过滤:&
AND
df2 = df[m & df['TYPE'].eq('A')]
print (df2)
R1 R2 W TYPE amount1 amount2 Status Exchange
0 123 12 1 A 111 222 C 1.5
然后通过反转掩码过滤所有其他组,并按所有列~
聚合和列:GroupBy.agg
GroupBy.first
amount
sum
cols = df.columns.difference(['R1','R2','W','amount1','amount2'])
d1 = dict.fromkeys(['amount1','amount2'], 'sum')
d2 = dict.fromkeys(cols, 'first')
df3 = df[~m].groupby(['R1','R2','W'], as_index=False).agg({**d1, **d2}).assign(TYPE='A')
print (df3)
R1 R2 W amount1 amount2 Exchange Status TYPE
0 123 12 2 555 555 1.5 A A
1 123 12 3 777 777 2.5 D A
最后加入concat
,如有必要,按以下方式排序DataFrame.sort_values
:
df4 = pd.concat([df2, df3], ignore_index=True, sort=False).sort_values(['R1','R2','W'])
print (df4)
R1 R2 W TYPE amount1 amount2 Status Exchange
0 123 12 1 A 111 222 C 1.5
1 123 12 2 A 555 555 A 1.5
2 123 12 3 A 777 777 D 2.5
推荐阅读
- tensorflow - !tensorboard --logdir= ^ SyntaxError: 无效语法
- python - Tensorflow:feed_dict 占位符是操作而不是张量
- c# - CloudTableClient.CreateCloudTableClient 抛出 System.IO.FileNotFoundException 类型的异常
- dhis-2 - 是否有任何命令行客户端可以在 DHIS2 中进行数据输入?
- java - Fabric-ca 证书不适用于 tomcat
- python - softmax交叉熵梯度的数值计算
- node.js - 将对象保存到猫鼬中的数组类型字段
- python-2.7 - 使用 NUTS 初始化的 PyMC3 贝叶斯推理
- vba - 7 字节十六进制到十进制转换
- sql - 编写查询以显示部门的 ID、名称和编号?