Python 如果DataFrame中的其他行值相同,如何聚合行值?
对于数据帧: df=数据帧(['2021-03-31',A0019','990RT','OFFSET','0.10'],['2021-03-31','A1019','990CT','MARK','0.10'],['2021-03-31','A0019','990RT','M 方舟、方舟100号、方舟2021-03-31号、方舟A0019号、方舟990RT号、方舟偏移量0.70号、方舟2021-03-31号、方舟A0029号、方舟990CT号、方舟偏移量1.10号、方舟2021-03-31号、方舟A0029号、方舟990CT号、方舟标记、, “9.10”]、[“2021-03-31”、“A0019”、“990QT”、“标记”、“99.10”]、[“2021-03-31”、“C0019”、“990QT”、“偏移量”、“1”]、[“2021-03-31”、“C0019”、“990QT”、“GHTC”、“5”], ['2021-03-31','C0019','990QT','OFFSET','15']],列=['DATE','A_ID','R_ID','TYPE','I_VAL']) >>>df 日期A_ID R_ID TYPE I_VAL 0 2021-03-31 A0019 990RT偏移量0.10 1201-03-31 A1019 990CT标记0.10 2021-03-31 A0019 990RT标记100 3 2021-03-31 A0019 990RT偏移量0.70 4 2021-03-31 A0029 990CT偏移量1.10 5 2021-03-31 A0029 990CT标记9.10 6 2021-03-31 A0019 990QT标记99.10 7 2021-03-31 C0019 990QT偏移量1 8 2021-03-31 C0019 990QT GHTC 5 9 2021-03-31 C0019 990QT偏移量15 每个非Python 如果DataFrame中的其他行值相同,如何聚合行值?,python,pandas,dataframe,Python,Pandas,Dataframe,对于数据帧: df=数据帧(['2021-03-31',A0019','990RT','OFFSET','0.10'],['2021-03-31','A1019','990CT','MARK','0.10'],['2021-03-31','A0019','990RT','M 方舟、方舟100号、方舟2021-03-31号、方舟A0019号、方舟990RT号、方舟偏移量0.70号、方舟2021-03-31号、方舟A0029号、方舟990CT号、方舟偏移量1.10号、方舟2021-03-31号、方舟
偏移量
(例如标记
,GHTC
)行根据日期、A_ID、R_ID
的组合,唯一地匹配零个或多个偏移量
行。也就是说,非偏移量
(例如标记
)与偏移量
行之间存在一对多关系
我需要分两步完成操作:
DATE、A\u ID、R\u ID
相同,则聚合行的值。将聚合值作为I_VAL
的值放在非OFFSET
行中类型的行
偏移量
#带有类型偏移的行将从结果df中删除。
#保留偏移量行以解释聚合
#0、1、2、3等是行的索引(行号)
日期A_ID R_ID TYPE I_VAL
0 2021-03-31 A0019 990RT偏移量0.10
1 2021-03-31 A1019 990CT标记0.10#无更新,不符合条件
2021-03-31 A0019 990RT标记100.80#更新为0、self和3之和
3 2021-03-31 A0019 990RT偏移量0.70
4 2021-03-31 A0029 990CT偏移量1.10
5 2021-03-31 A0029 990CT标记10.20#更新为自身值和4的总和
6 2021-03-31 A0019 990QT标记99.10#无更新,不符合条件
7 2021-03-31 C0019 990QT偏移量1
8 2021-03-31 C0019 990QT GHTC 21#更新为自身、7和9的总和
9 2021-03-31 C0019 990QT偏移量15
对于步骤2,我可以执行以下操作:
filtered_df=df[df.TYPE!='OFFSET']
但是,我不知道如何聚合这些值?
这讨论了一个类似的问题,但我无法根据我的要求修改它。对于步骤1: 首先使用以下方法将'I_VAL'列的数据类型从
string
更改为float
:
最后,您可以使用方法和布尔掩蔽:
df.loc[df['TYPE']!='OFFSET','I_VAL']=df.groupby(['DATE','A_ID','R_ID'],as_index=False,sort=False).transform('sum')[df['TYPE']!='OFFSET']['I_VAL']
现在,如果您打印df
,您将获得所需的输出:
#output
DATE A_ID R_ID TYPE I_VAL
0 2021-03-31 A0019 990RT OFFSET 0.1
1 2021-03-31 A1019 990CT MARK 0.1
2 2021-03-31 A0019 990RT MARK 100.8
3 2021-03-31 A0019 990RT OFFSET 0.7
4 2021-03-31 A0029 990CT OFFSET 1.1
5 2021-03-31 A0029 990CT MARK 10.2
6 2021-03-31 A0019 990QT MARK 99.1
7 2021-03-31 C0019 990QT OFFSET 1.0
8 2021-03-31 C0019 990QT GHTC 21.0
9 2021-03-31 C0019 990QT OFFSET 15.0
#output
DATE A_ID R_ID TYPE I_VAL
1 2021-03-31 A1019 990CT MARK 0.1
2 2021-03-31 A0019 990RT MARK 100.8
5 2021-03-31 A0029 990CT MARK 10.2
6 2021-03-31 A0019 990QT MARK 99.1
8 2021-03-31 C0019 990QT GHTC 21.0
第二步:
使用布尔掩蔽:
filtered_df = df[df.TYPE != 'OFFSET']
现在,如果您打印filtered_df
,您将获得所需的输出:
#output
DATE A_ID R_ID TYPE I_VAL
0 2021-03-31 A0019 990RT OFFSET 0.1
1 2021-03-31 A1019 990CT MARK 0.1
2 2021-03-31 A0019 990RT MARK 100.8
3 2021-03-31 A0019 990RT OFFSET 0.7
4 2021-03-31 A0029 990CT OFFSET 1.1
5 2021-03-31 A0029 990CT MARK 10.2
6 2021-03-31 A0019 990QT MARK 99.1
7 2021-03-31 C0019 990QT OFFSET 1.0
8 2021-03-31 C0019 990QT GHTC 21.0
9 2021-03-31 C0019 990QT OFFSET 15.0
#output
DATE A_ID R_ID TYPE I_VAL
1 2021-03-31 A1019 990CT MARK 0.1
2 2021-03-31 A0019 990RT MARK 100.8
5 2021-03-31 A0029 990CT MARK 10.2
6 2021-03-31 A0019 990QT MARK 99.1
8 2021-03-31 C0019 990QT GHTC 21.0
嘿@Anurag Dabas,谢谢。这有帮助。我将
groupby
构造更改为在“sum”逻辑中添加多个列:groupby\u obj=df.groupby(['DATE','A\u ID','R\u ID',as\u index=False,sort=False)[[I\u VAL',P\u VAL']]转换('sum')
。由_obj使用此组_执行其他操作。