【问题标题】:Sum a column by ID, but skip the first instance?按 ID 对列求和,但跳过第一个实例?
【发布时间】:2019-01-15 14:32:10
【问题描述】:

我有一个如下所示的数据框。

A = [{'ID':1, 'Period':1, 'Variable':21}, {'ID':1,'Period':2, 'Variable':12}, 
      {'ID':2, 'Period':2, 'Variable':14}, {'ID':2, 'Period':3, 'Variable':18}]

df = pd.DataFrame(A)

我基本上想做一个像df.groupby('ID').sum() 这样的操作来获得Variable 列的总和,但是我需要跳过为特定ID 观察到的第一个周期。因此,对于 ID=1,我将在第 1 期放弃观察,但对于 ID=2,我将在第 2 期放弃观察。

我该怎么做?

【问题讨论】:

  • 所以你想要df.groupby('ID')['Variable'].apply(lambda x: x.iloc[1:].sum())这样的东西?
  • 就是这样。谢谢!
  • 如果它解决了您的问题,您应该接受其中一个答案,这样问题就不会悬而未决

标签: python pandas dataframe pandas-groupby


【解决方案1】:

您可以在每个组内切片以忽略第一行并调用sum

In[46]:
df.groupby('ID')['Variable'].apply(lambda x: x.iloc[1:].sum())

Out[46]: 
ID
1    12
2    18
Name: Variable, dtype: int64

如果你想要所有的列:

In[47]:
df.groupby('ID').apply(lambda x: x.iloc[1:].sum())

Out[47]: 
    ID  Period  Variable
ID                      
1    1       2        12
2    2       3        18

【讨论】:

    【解决方案2】:

    您可以使用pd.Series.duplicated 忽略第一次出现:

    res = df[df['ID'].duplicated()].groupby('ID').sum()
    
    print(res)
    
        Period  Variable
    ID                  
    1        2        12
    2        3        18
    

    【讨论】:

    • 一直在考虑相同的思路,就性能而言,这可能与groupby+1 上的apply 一样费力
    • @EdChum,可能,是的,我只是认为lambda 为大量组添加了额外的函数调用。而布尔索引是一次性应用的。
    • 大概也可以创建groupby一次然后group.sum() - group.first()也...
    • @JonClements 好主意,您应该将其发布为答案。虽然说 groupby 对象只是元数据,但您仍然会调用计算 sum 然后 first 尽管我希望 first 很快
    • @EdChum meh... 它并没有真正忽略第一行只是抵消效果所以我想它可能在某些情况下容易失败.​​..只是把它扔在那里以防有人想要玩它 - 但我不是特别高兴这是一个不错的答案。
    【解决方案3】:

    选择必要的观察,然后应用聚合:

    df[df.ID != df.Period].groupby('ID').sum()
    

    输出

        Period  Variable
    ID                  
    1        2        12
    2        3        18
    

    【讨论】:

    • {'ID':2, 'Period':1, 'Variable':14} 不会失败吗?我认为这可能是在利用 OP 示例中的漏洞?
    • @roganjosh 是的,我的解决方案基于第一个句点等于 ID 的规则。也许你是对的。
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多