我需要逐月查找显示年初至今唯一值的方式。例如:
month value
1 a
1 b
1 a
2 a
2 a
2 a
3 c
3 b
3 b
4 d
4 e
4 f
应输出:
Month Monthly unique Year to date unique
1 2 2
2 1 2
3 2 3
4 3 6
对于每月唯一性,这只是group by和unique()的问题,但这种方式不适用于年初至今。自年初以来,可以通过使用for循环并逐月过滤数据帧来实现年初至今,但这是我想忽略的一种缓慢的,非Python的方式。
如何高效地做到这一点?
答案 0 :(得分:5)
让我们做
s = df.groupby('month').value.agg(['nunique',list])
s['list'] = s['list'].cumsum().map(lambda x : len(set(x)))
s
nunique list
month
1 2 2
2 1 2
3 2 3
4 3 6
答案 1 :(得分:5)
BEN_YO的方法对于小型数据集非常简单且有效。但是,由于cumsum
在(字符串列表)上,因此在大数据帧上可能会很慢且代价很高。
让我们首先尝试drop_duplicates
,并且仅对重复项有效:
(df.drop_duplicates(['month','value'])
.assign(year=lambda x: ~x.duplicated(['value']))
.groupby('month')
.agg({'value':'nunique', 'year':'sum'})
.assign(year=lambda x: x.year.cumsum())
)
输出:
value year
month
1 2 2
2 1 2
3 2 3
4 3 6