如何按日期对条目进行分组并计算百分比

时间:2016-12-27 13:52:57

标签: python pandas

我有以下原始数据:

df = 

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

对于每个日期,我需要计算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'])

更新

print(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 个答案:

答案 0 :(得分:2)

更新,对于{34}的GROUP列,浮动64" D型细胞

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

答案 1 :(得分: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')