如何在熊猫数据框中执行不同值的累积和

Posted

技术标签:

【中文标题】如何在熊猫数据框中执行不同值的累积和【英文标题】:How to perform a cumulative sum of distinct values in pandas dataframe 【发布时间】:2020-01-08 11:24:43 【问题描述】:

我有一个这样的数据框:

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()

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

【问题讨论】:

【参考方案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 它没有按日期排序。你真是个天才!

以上是关于如何在熊猫数据框中执行不同值的累积和的主要内容,如果未能解决你的问题,请参考以下文章

如何将熊猫数据框中每列中唯一值的数量绘制为条形图?

如何在熊猫数据框中执行左外连接?

如何在熊猫数据框中执行按行if和数学运算

如何在熊猫数据框中使用列表作为值?

如何在熊猫数据框中使用列表作为值?

如何在熊猫数据框中划分时间