【问题标题】:how to use pandas to subtract rows of a column based upon data by group?如何使用pandas根据分组数据减去一列的行?
【发布时间】:2020-12-15 06:33:22
【问题描述】:

我正在尝试根据第一个和最后一个日期按组计算列的行之间的差异。 例如:

df = pd.DataFrame({'ID':["a","a","a","b","b","b"],
                   'start_yr':[2010,2013,2020,2009,2005,2019],
                   'amt':[10,40,30,50,60,100]})

应该返回

a 20   (30-10)
b 40   (100 - 60)

我已经尝试过这样的东西,但我肯定错过了一些东西。

#df['diff'] = df.groupby('ID')['start_yr','amt'].transform(lambda x: (x.max()-x.min()))
df['diff'] = dThe f.groupby('ID')['start_yr'].transform(lambda x: (x.max()-x.min()))

【问题讨论】:

    标签: python pandas date pandas-groupby subtraction


    【解决方案1】:

    首先按DataFrame.sort_values 对两列进行排序,然后用GroupBy.agg 中的第一个值减去最后一个:

    df1 = (df.sort_values(['ID','start_yr'])
             .groupby('ID')['amt']
             .agg(lambda x: (x.iat[-1]-x.iat[0]))
             .reset_index())
    

    或者用聚合 GroupBy.first 和 GroupBy.last 减去值:

    df = df.sort_values(['ID','start_yr'])
    g = df.groupby('ID')['amt']
    
    df1 = g.last().sub(g.first()).reset_index()
    

    或者对于第一个和最后一个值可以使用DataFrame.drop_duplicates:

    df = df.sort_values(['ID','start_yr'])
    
    df1 = (df.drop_duplicates('ID', keep='last').set_index('ID')['amt']
             .sub(df.drop_duplicates('ID').set_index('ID')['amt'])
             .reset_index())
    

    print (df1)
      ID  amt
    0  a   20
    1  b   40
    

    编辑:这是没有先按DataFrameGroupBy.idxmax 排序的想法 DataFrameGroupBy.idxmin 按索引的值(此处为 amt)按 start_yr 的最小值和最大值:

    g = df.set_index('amt').groupby('ID')['start_yr']
    
    s = g.idxmax().sub(g.idxmin()).reset_index()
    print (s)
      ID  start_yr
    0  a        20
    1  b        40
    

    【讨论】:

    • 这是完美的谢谢。所以没有办法明确地使用日期来引用另一列。先排序仍然有效吗?值得注意的是,我正在使用。一个实际的日期字段。不是 int 作为日期。我应该添加的。
    • @nerdlyfe - 如果日期是日期时间,则排序工作完美。
    • @nerdlyfe - 关于性能的有趣问题。我认为取决于数据,你也让我知道没有排序的解决方案,添加到答案中。谢谢。
    【解决方案2】:

    让我们尝试两个步骤:

    s = df.sort_values(['ID','start_yr']).groupby(['ID'])['amt'].agg(['first','last'])
    output = s['last'] - s['first']
    

    输出:

    ID
    a    20
    b    40
    dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 2018-10-12
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多