熊猫:如何获得两个索引计算的唯一值

时间:2020-09-22 13:54:22

标签: python pandas

我需要逐月查找显示年初至今唯一值的方式。例如:

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的方式。

如何高效地做到这一点?

2 个答案:

答案 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