2016-12-27 73 views
2

我有以下的原始數據:如何按日期組條目,並計算百分比

df = 

MONTH DAY ID GROUP 
1  1  222 1 
1  1  111 2 
1  2  333 2 
... 
12  1  XXS 1 

對於每一天,我需要calcuate有Group等於1條目的百分比。結果應該是在以下格式的新數據框(日期應爲dd/mm/yy):

date,percent 
01/01/16,50 
02/01/16,0 
... 

我嘗試這樣做,但它不會給預期的結果,因爲我不知道如何從這個出發點。不知道如何通過date到單個列中的格式dd/mm/yy以及如何計算具有GROUP == 1條目的百分比:

new_df = df.groupby(['MONTH', 'DAY']).agg(['count']) 

UPDATE:

打印(df.types)給出以下輸出:

MONTH     float64 
DAY      float64 
GROUP     float64 
ID      object 
date      datetime64[ns] 

這是樣品真實數據:

MONTH DAY GROUP ID date 
1.0  4.0 2.0 00085163 2016-01-04 
1.0  4.0 1.0 000F9334 2016-01-04 
1.0  4.0 2.0 002744A2 2016-01-04 
1.0  4.0 2.0 00337BB1 2016-01-04 
1.0  4.0 2.0 00374DE5 2016-01-04 

回答

2

更新:爲 「float64」 D型的GROUP

In [67]: df 
Out[67]: 
    MONTH DAY GROUP  ID 
0 1.0 4.0 2.0 00085163 
1 1.0 4.0 1.0 000F9334 
2 1.0 4.0 2.0 002744A2 
3 1.0 4.0 2.0 00337BB1 
4 1.0 4.0 2.0 00374DE5 

In [68]: (df.assign(date=pd.to_datetime(df.assign(YEAR=pd.datetime.now().year) 
    ...:         .loc[:, ['YEAR','MONTH','DAY']]) 
    ...:     .dt.strftime('%d/%m/%y')) 
    ...: .groupby('date', as_index=0)['GROUP'] 
    ...: .agg({'percent':lambda x: len(np.where(np.isclose(x,1))[0])/x.count()*100}) 
    ...:) 
    ...: 
Out[68]: 
     date percent 
0 04/01/16  20.0 

老答案整數GROUP列:

In [40]: df.groupby(['MONTH', 'DAY'], as_index=0)['GROUP'].agg({'percent':lambda x: len(x[x==1])/x.count()*100}) 
Out[40]: 
    MONTH DAY percent 
0  1 1  50 
1  1 2  0 
2  12 1  100 

,如果你需要日期爲一列:

In [50]: df['date'] = pd.to_datetime(df.assign(YEAR=pd.datetime.now().year).loc[:, ['YEAR','MONTH','DAY']]).dt.strftime('%d/%m/%y') 

In [51]: df 
Out[51]: 
    MONTH DAY ID GROUP  date 
0  1 1 222  1 01/01/16 
1  1 1 111  2 01/01/16 
2  1 2 333  2 02/01/16 
3  12 1 444  1 01/12/16 

In [52]: df.groupby('date', as_index=0)['GROUP'].agg({'percent':lambda x: len(x[x==1])/x.count()*100}) 
Out[52]: 
     date percent 
0 01/01/16  50 
1 01/12/16  100 
2 02/01/16  0 
+0

感謝。我試過你的解決方案。一個問題:由於某種原因,我有'percent'總是等於0,但是如果我做'.agg(['count'])',那麼我可以看到像3000,2500等數值。你知道爲什麼零可以在計算百分比時出現('x.count()'肯定不爲零)? – Dinosaurius

+0

@Dinosaurius,這意味着沒有條目,其中'GROUP == 1' – MaxU

+0

有趣的是,我試圖將'GROUP'更改爲2(只有兩個可能的值:'1'和'2'),但是對於所有條目,我再次獲得百分比等於0。 – Dinosaurius

0

這是一個非常強大的解決方案,但它似乎工作:

temp = df.groupby(['MONTH', 'DAY']).agg({'GROUP': lambda x: float(len(x[x==1]))/x.count()*100}).astype(float).reset_index() 

print temp 
temp.rename(columns={'GROUP': 'PERCENT'}, inplace=True) 
temp['DATE'] = '2016-' + temp['MONTH'].map(int).map(str) + '-' + temp['DAY'].map(int).map(str) 
temp['DATE'] = temp['DATE'].apply(lambda x: pd.to_datetime(x)) 

final = temp[['DATE', 'PERCENT']].set_index('DATE')