【问题标题】:How to perform a cumulative sum of distinct values in pandas dataframe如何在熊猫数据框中执行不同值的累积和
【发布时间】:2023-04-03 14:21:02
【问题描述】:

我有一个这样的数据框:

id    date         company    ......
123   2019-01-01        A
224   2019-01-01        B
345   2019-01-01        B
987   2019-01-03        C
334   2019-01-03        C
908   2019-01-04        C
765   2019-01-04        A
554   2019-01-05        A
482   2019-01-05        D

并且我想获取“公司”列随时间推移的唯一值的累积数量。因此,如果一家公司在以后出现,则不会再次计算在内。

我的预期输出是:

date            cumulative_count
2019-01-01      2
2019-01-03      3
2019-01-04      3
2019-01-05      4

我试过了:

df.groupby(['date']).company.nunique().cumsum()

但如果同一家公司出现在不同的日期,则此重复计算。

【问题讨论】:

    标签: python pandas dataframe datetime pandas-groupby


    【解决方案1】:

    另一种方法尝试修复 anky_91

    (df.company.map(hash)).expanding().apply(lambda x: len(set(x)),raw=True).groupby(df.date).max()
    Out[196]: 
    date
    2019-01-01    2.0
    2019-01-03    3.0
    2019-01-04    3.0
    2019-01-05    4.0
    Name: company, dtype: float64
    

    来自 anky_91

    (df.company.astype('category').cat.codes).expanding().apply(lambda x: len(set(x)),raw=True).groupby(df.date).max()
    

    【讨论】:

    • @anky_91 哈希就像你为分解所做的一样:-)
    【解决方案2】:

    这需要比 anky 的答案更多的代码,但仍然适用于示例数据:

    df = df.sort_values('date')
    (df.drop_duplicates(['company'])
       .groupby('date')
       .size().cumsum()
       .reindex(df['date'].unique())
       .ffill()
    )
    

    输出:

    date
    2019-01-01    2.0
    2019-01-03    3.0
    2019-01-04    3.0
    2019-01-05    4.0
    dtype: float64
    

    【讨论】:

      【解决方案3】:

      使用duplicated + cumsum + last

      m = df.duplicated('company')
      d = df['date']
      
      (~m).cumsum().groupby(d).last()
      

      date
      2019-01-01    2
      2019-01-03    3
      2019-01-04    3
      2019-01-05    4
      dtype: int32
      

      【讨论】:

      • @user3483203 将其应用于总数据帧时不起作用。它给了我正确的总数,但随着时间的推移是不正确的。例如在某些日期累积减少,这应该是不可能的
      • @user3483203 它没有按日期排序。你真是个天才!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      相关资源
      最近更新 更多