2017-10-20 34 views
1

我希望能夠在數據框上使用groupby和resample來獲取每年一次的字段計數。比方說,我有一個數據幀結構爲這樣:在熊貓中使用Groupby對象和重採樣

df = pd.DataFrame({'year': {0: '2017', 1: '2018', 2: '2016', 3: '2018'}, 'month': {0: '1', 1: '2', 2: '3', 3: '4'}, 'day': {0: '1', 1: '1', 2: '1', 3: '3'}}) 
df['Date']=pd.to_datetime(df) 
#Sorry there is probably and easier way to set up the df 
df['B']=[1, 2, 3, 1] 
df['C']=[2,3,4, 1] 
df=df.ix[:, ['Date', 'B', 'C']] 

df.groupby('B').resample('A', on='Date') 

如何按列B獲得的代碼的最後一行到組,仍然可以通過年份或月份,等重新取樣?最後,我正在尋找按B分組的每年C計數。如果可能,我希望在過程中保持我的索引。謝謝。

回答

1

可以GROUPBY列B和date.dt.year

df.groupby([df['Date'].dt.year, 'B']).C.count().reset_index() 

    Date B C 
0 2016 3 1 
1 2017 1 1 
2 2018 1 1 
3 2018 2 1 

Opion 2使用石斑魚

df.groupby([pd.Grouper(key = 'Date', freq='A'), 'B']).C.count().reset_index() 

    Date  B C 
0 2016-12-31 3 1 
1 2017-12-31 1 1 
2 2018-12-31 1 1 
3 2018-12-31 2 1 

編輯:圓,有關使用重採樣與GROUPBY的方式,但我不看不到,爲什麼會一個使用它

df.set_index('Date').groupby('B').resample('A').C.count().reset_index() 
+0

公平點。只是所以我知道,沒有辦法使用pd.resample函數?謝謝。 –

+0

@TylerRussell,請參閱編輯以使用羣組重複採樣 – Vaishali

+0

這是一種有用的方式來看待這兩種方式。感謝你的幫助。 –

1

您可以使用resample但不建議

df.groupby('B').apply(lambda x : x.resample('A', on='Date').C.count()) 
Out[761]: 
B Date  
1 2017-12-31 1 
    2018-12-31 1 
2 2018-12-31 1 
3 2016-12-31 1 
Name: C, dtype: int64 
+0

檢查我的編輯,而不適用:) – Vaishali

+0

@Vaishali很好的解決方案upvoted – Wen