2016-11-27 159 views
4

我有一個數據幀「東風」,看起來像這樣:Python的熊貓數據幀的GroupBy大小根據病情

id date1 date2 
1 11/1/2016 11/1/2016 
1 11/1/2016 11/2/2016 
1 11/1/2016 11/1/2016 
1 11/1/2016 11/2/2016 
1 11/2/2016 11/2/2016 
2 11/1/2016 11/1/2016 
2 11/1/2016 11/2/2016 
2 11/1/2016 11/1/2016 
2 11/2/2016 11/2/2016 
2 11/2/2016 11/2/2016 

我想這樣做是爲了GROUPBY的ID,然後得到每個ID在該尺寸日期1 = DATE2。結果應該是這樣的:

id samedate count 
1 11/1/2016 2 
1 11/2/2016 1 
2 11/1/2016 2 
2 11/2/2016 2 

我已經試過這樣:

gb=df.groupby(id').apply(lambda x: x[x.date1== x.date2]['date1'].size()) 

而得到這個錯誤:

TypeError: 'int' object is not callable 

你肯定會標誌中的每個實例,其中日期1和date2相等,然後每個相同的日期計算每個ID的標誌,但我必須相信有一個groupby選項。

回答

4

您可以使用boolean indexing,然後再彙總size

df.date1 = pd.to_datetime(df.date1) 
df.date2 = pd.to_datetime(df.date2) 

df = df[df.date1 == df.date2] 
gb=df.groupby(['id', 'date1']).size().reset_index(name='count') 
print (gb) 
    id  date1 count 
0 1 2016-11-01  2 
1 1 2016-11-02  1 
2 2 2016-11-01  2 
3 2 2016-11-02  2 

時序

In [79]: %timeit (df[df.date1 == df.date2].groupby(['id', 'date1']).size().reset_index(name='count')) 
100 loops, best of 3: 3.84 ms per loop 

In [80]: %timeit (df.groupby(['id', 'date1']).apply(lambda x: (x['date1'] == x['date2']).sum()).reset_index()) 
100 loops, best of 3: 7.57 ms per loop 

代碼時序

#len df = 10k 
df = pd.concat([df]*1000).reset_index(drop=True) 
#print (df) 

df.date1 = pd.to_datetime(df.date1) 
df.date2 = pd.to_datetime(df.date2) 
+0

感謝您的 時間。這是一個更好的方法。 – Zero

+0

謝謝你的回答,第一個想法與你的答案非常相似。 – jezrael

+0

謝謝。優秀! – clg4

3

你需要組上兩列,然後申請檢查date1等於date2

In [105]: df.groupby(['id', 'date1']).apply(lambda x: (x['date1'] == x['date2']).sum()) 
Out[105]: 
id date1 
1 11/1/2016 2 
    11/2/2016 1 
2 11/1/2016 2 
    11/2/2016 2 
dtype: int64 
+0

你要去如果你申請的lambda函數對整組比jezrael慢,如果你做的lambda函數內部的布爾比較。 – Boud

+0

感謝您的回答。 ! – clg4