2016-12-27 3 views
2

日付でグループのエントリにして計算し、私は、次の生データ持っ方法:各日付のパーセント

df = 

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

を、私は1に等しいGroupを持つエントリの割合をcalcuateする必要があります。私はこのことから続行する方法がわからないので、私はこれを試してみましたが、それは期待される結果を与えるものではありません

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

:結果は次の形式(日付はdd/mm/yyする必要があります)で新しいデータフレームでなければなりませんポイント。

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

UPDATE:

プリント(df.types)は、次の出力を与える形式dd/mm/yyで単一の列にdateを渡す方法とGROUP == 1を持つエントリの割合を計算する方法がわかりません:

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

UPDATE:整数GROUP列の "のfloat64" DTYPEの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 

旧答えを

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

感謝。私はあなたの解決策を試しました。 1つの質問:何らかの理由で私は '%'を常に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')