【问题标题】:Subtract rows in a grouped Dataframe减去分组数据框中的行
【发布时间】:2021-12-22 21:57:52
【问题描述】:

我有一个 pandas 数据框,如果它们具有相同的组,我需要减去行。

输入数据框:

A B Value
A1 B1 10.0
A1 B1 5.0
A1 B2 5.0
A2 B1 3.0
A2 B1 5.0
A2 B2 1.0

预期的数据框:

A B Value
A1 B1 5.0
A1 B2 5.0
A2 B1 -2.0
A2 B2 1.0

逻辑:例如数据帧的第一行和第二行在 A1 和 B1 组中,因此值必须是 10.0 - 5.0 = 5.0。 4º 和 5º 行也具有相同的组,因此值必须是 3.0 - 5.0 = -2.0。

仅当 A 值和 B 值相同时才减去行。

谢谢!

【问题讨论】:

  • 解释什么是逻辑
  • 数据有哪些假设?每个 (A, B) 对最多有 2 行吗?这两行是总是相邻的还是可以散开的?减法是否应该始终按照这些行出现的顺序进行?
  • 每对(A,B)最多有 2 行。这些行总是相邻的。减法总是按照这些行出现的顺序。谢谢!

标签: python pandas dataframe


【解决方案1】:

您可以准备要减去的重复行,然后在分组后求和。这也适用于以正确顺序重复的多个行。

import pandas as pd
df = pd.read_html('https://stackoverflow.com/q/70438208/14277722')[0]

df.loc[df.duplicated(subset=['A','B']), 'Value'] *=-1
df.groupby(['A','B'], as_index=False).sum()

输出

    A   B  Value
0  A1  B1    5.0
1  A1  B2    5.0
2  A2  B1   -2.0
3  A2  B2    1.0

【讨论】:

    【解决方案2】:

    试试:

    subtract = lambda x: x.iloc[0] - (x.iloc[1] if len(x) == 2 else 0)
    out = df.groupby(['A', 'B'])['Value'].apply(subtract).reset_index()
    print(out)
    
    # Output:
        A   B  Value
    0  A1  B1    5.0
    1  A1  B2    5.0
    2  A2  B1   -2.0
    3  A2  B2    1.0
    

    【讨论】:

      【解决方案3】:

      让我们通过groupbyapply内的条件

      out = df.groupby(['A','B'])['Value'].apply(lambda x : x.iloc[0]-x.iloc[-1] if len(x)>1 else x.iloc[0]).reset_index(name = 'Value')
      Out[18]: 
          A   B  Value
      0  A1  B1    5.0
      1  A1  B2    5.0
      2  A2  B1   -2.0
      3  A2  B2    1.0
      

      【讨论】:

        【解决方案4】:

        一种选择是使用 numpy 的 reduce 函数:

        df.groupby(['A', 'B'], as_index = False).Value.agg(np.subtract.reduce)
         
            A   B  Value
        0  A1  B1    5.0
        1  A1  B2    5.0
        2  A2  B1   -2.0
        3  A2  B2    1.0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-03
          • 2019-03-08
          • 1970-01-01
          • 2016-10-11
          • 1970-01-01
          • 2022-01-08
          • 2017-04-15
          • 2018-06-29
          相关资源
          最近更新 更多