如何在熊猫数据框中执行不同值的累积和
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 它没有按日期排序。你真是个天才!以上是关于如何在熊猫数据框中执行不同值的累积和的主要内容,如果未能解决你的问题,请参考以下文章