我有以下原始数据:
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
答案 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')