【问题标题】:pandas sum the differences between two columns in each grouppandas 将每组中两列之间的差异求和
【发布时间】:2018-08-25 18:30:47
【问题描述】:

我有一个df 的样子,

A               B              C    D
2017-10-01      2017-10-11     M    2017-10
2017-10-02      2017-10-03     M    2017-10
2017-11-01      2017-11-04     B    2017-11
2017-11-08      2017-11-09     B    2017-11
2018-01-01      2018-01-03     A    2018-01

ABdtypedatetime64CDstrings

我喜欢groupby CD 并得到 BA 之间的区别,

df.groupby(['C', 'D']).apply(lambda row: row['B'] - row['A'])

但我不知道如何对每个组中的这些差异求和并将值分配给一个新列,比如E,可能在一个新的df 中,

C    D          E
M    2017-10    11
M    2017-10    11
B    2017-11    4
B    2017-11    4
A    2018-01    2

【问题讨论】:

  • 给定示例的预期输出是什么?
  • 当你groupby 时你想对AB 列的差异应用什么函数

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

基于你的代码

df.merge(df.groupby(['C', 'D']).apply(lambda row: row['B'] - row['A']).sum(level=[0,1]).reset_index())
Out[292]: 
           A          B  C        D       0
0 2017-10-01 2017-10-11  M  2017-10 11 days
1 2017-10-02 2017-10-03  M  2017-10 11 days
2 2017-11-01 2017-11-04  B  2017-11  4 days
3 2017-11-08 2017-11-09  B  2017-11  4 days
4 2018-01-01 2018-01-03  A  2018-01  2 days

【讨论】:

  • 想知道是否可以将Timedelta.days 也应用于一个班轮代码,所以我以后不必df['E'].apply(lambda x: x.days)
  • @daiyue 你可以尝试在这里添加 df.groupby(['C', 'D']).apply(lambda row:( row['B'] - row['A']) .days)
  • AttributeError: 'Series' object has no attribute 'days'
  • @daiyue 让我们试试df.groupby(['C', 'D']).apply(lambda row: (row['B'] - row['A'])/np.timedelta64(1, 'D'))
  • @daiyue 我也觉得你不需要 apply (df.B-df.A).dt.days
猜你喜欢
  • 2019-11-02
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2019-03-18
  • 2016-10-01
  • 1970-01-01
相关资源
最近更新 更多