Python 如果DataFrame中的其他行值相同,如何聚合行值?

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号、方舟

对于数据帧:

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 每个非
偏移量
(例如
标记
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使用此组_执行其他操作。