【问题标题】:Finding difference between two columns of a dataframe along with groupby查找数据框的两列与 groupby 之间的差异
【发布时间】:2020-12-03 17:47:53
【问题描述】:

我看到了这个问题的原始版本here

但我的数据框有不同的名称,我想为它们分别计算

   A   B   C
0  a   3   5
1  a   6   9
2  b   3   8
3  b  11  19

我想按 A 分组,然后找到备用 B 和 C 之间的差异。类似这样

   A   B   C   dA
0  a   3   5   6
1  a   6   9  NaN
2  b   3   8  16
3  b  11  19  NaN

我试过了

df['dA']=df.groupby('A')(['C']-['B'])
df['dA']=df.groupby('A')['C']-df.groupby('A')['B']

他们都没有帮助 我犯了什么错误?

【问题讨论】:

  • 在您的示例中,dA 的值是如何计算的? 6 和 16 是从哪里来的?
  • 9 来自 C - 3 来自 B 为 a ,类似地 19 来自 C - 3 来自 B 为 b
  • 如果我只做 df['dA']=df['C']-df['B'],它可以工作,但 dA 也包含 2(6 到 16 之间),它是使用计算的一个来自 a 的数据和一个来自 b 的数据。我不想要,所以我想将它与 groupby 一起使用
  • 您在寻找df.groupby('A').apply(lambda x: x['C'].shift(-1) - x['B'])吗?
  • 是的,谢谢@Ben.T

标签: python pandas


【解决方案1】:

IIUC,这是执行计算的一种方法:

# create the data frame
from io import StringIO
import pandas as pd

data = '''idx    A   B   C
0  a   3   5
1  a   6   9
2  b   3   8
3  b  11  19
'''

df = pd.read_csv(StringIO(data), sep='\s+', engine='python').set_index('idx')

现在,计算dA。我看 C 的最后一个值减去 B 的第一个值,按 A 分组。(这是对的吗?还是 max(C) 减去 min(B)?)。如果保证 A 值成对出现,那么@BenT 的shift() 会更简洁。

dA = (
    (df.groupby('A')['C'].transform('last') - 
     df.groupby('A')['B'].transform('first'))
       .drop_duplicates()
       .rename('dA'))

print(pd.concat([df, dA], axis=1))

     A   B   C    dA
idx                 
0    a   3   5   6.0
1    a   6   9   NaN
2    b   3   8  16.0
3    b  11  19   NaN

我使用groupby().transform() 来保存索引值,以支持concat 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2013-07-12
    • 2013-10-09
    • 2016-05-02
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多