2016-03-02 191 views
-3

我是一个Pandas DF,其中包含日期列和ID列。我需要按日期对这些数据进行分组/排序,并为每个日期计算自第一行(时间轴开始)以来看到的唯一ID的数量。有没有办法做到这一点使用熊猫/ numpy没有写出循环?查找唯一值的累积数量

+0

如何计算的唯一ID,然后应用 “cumsum” 是什么? – MaxU

+1

如果您要提供样本输入数据和期望的输出,我们可以为您提供工作示例;) – MaxU

+0

直到给定日期看到的唯一ID总数与每天看到的唯一ID总和不同。换句话说,U(Dn)!= U(D1)+ U(D2)+ U(D3)+ ... + D(n)'。 –

回答

2

看看pandas.unique:

import pandas as pd 
for date in pd.unique(df['Date']): 
    unique_ids = pd.unique(df[df['Date']==date]['id']) 
    print len(unique_ids) 

编辑:第二次尝试

newdf = df[['Date', 'id']].drop_duplicates() 
newdf.groupby('Date').count() 
+0

正如我问:是否有办法做到这一点,而不写出一个循环 –

+0

是的,这与一个修改工作:在调用drop_duplicates指定列。所以最后一行是:'df [['date','id']]。drop_duplicates(['id']).groupby('date')。count()。cumsum()' –

+0

好的答案。 IINM,它依赖于日期排序的项目,所以它需要排序,如果没有。 –

1

至少现在是清楚OP希望...

print(df.groupby('date').id.nunique().cumsum()) 

测试数据套装:

date;id 
2012-03-31;111 
2012-03-31;2 
2012-03-31;1 
2012-03-31;4 
2012-04-01;15 
2012-04-01;6 
2012-04-01;7 
2012-04-01;118 
2012-04-01;9 
2012-05-01;10 
2012-05-01;11 

的两种不同的方法比较:

import pandas as pd 

df = pd.read_csv('data.csv', sep=';').sort('date') 


print(df[['date','id']].drop_duplicates(['id']).groupby('date').count().cumsum()) 
print(df.groupby('date').id.nunique().cumsum()) 

输出:

  id 
date 
2012-03-31 4 
2012-04-01 9 
2012-05-01 11 
date 
2012-03-31  4 
2012-04-01  9 
2012-05-01 11 
Name: id, dtype: int64 

PS所以它不会返回正确的结果。至少对于那个数据集。这就是为什么提供测试数据集和预期输出非常重要!

PPS另一个有趣的现象:

from timeit import Timer 
import pandas as pd 

df = pd.read_csv('data.csv', sep=';', parse_dates=['date']).sort_values(['date']) 

def drop_dups(): 
    df[['date','id']].drop_duplicates(['id']).groupby('date').count().cumsum() 

def nunique(): 
    df.groupby('date').id.nunique().cumsum() 


print('drop_dups():\t{:.6f}'.format(Timer(drop_dups).timeit(1000))) 
print('nunique():\t{:.6f}'.format(Timer(nunique).timeit(1000))) 

输出:

drop_dups(): 6.722572 
nunique():  1.512233 
+0

不,这不会返回正确的结果。我已经解释了为什么在这个问题下对你的评论。 –

+0

@DmitryB,是的。我已经用证明更新了我的答案。感谢downvoting! – MaxU

+0

你正在做一个我从未说过的假设:ID总是在增加。也许我应该提供数据,但缺乏并没有停止给出正确的答案。 –