我有pandas df,我试图在其中按'agr_group'
对其进行分组。 'agr_group'
只是使用agr_signal
和diff
函数的cumsum
的计数。
BeginDate Consecutive EndDate end_price start_price total_return agr_signal agr_group
2018-03-22 14 2018-04-04 0.000838 0.000997 -0.159478 -1 1.0
2018-04-05 2 2018-04-06 0.000738 0.000754 -0.021220 -1 1.0
2018-04-07 2 2018-04-08 0.000769 0.000795 -0.032704 -1 1.0
2018-04-09 3 2018-04-11 0.000721 0.000713 0.011220 0 2.0
2018-04-12 9 2018-04-20 0.004812 0.000876 4.493151 1 3.0
2018-04-21 13 2018-05-03 0.004045 0.004250 -0.048235 -1 4.0
我正在尝试使用以下代码再次将我的df分组,
df1 = pd.DataFrame({'BeginDate1' : df.groupby('agr_group').BeginDate.first(),
'EndDate1' : df.groupby('agr_group').BeginDate.last(),
'Consecutive1' : df.groupby('agr_group').size(),
'start_price1':df.groupby('agr_group').start_price.first(),
'end_price1':df.groupby('agr_group').start_price.last()}).reset_index(drop=True)
输出为
BeginDate1 Consecutive1 EndDate1 end_price1 start_price1
2018-03-22 3 2018-04-07 0.000795 0.000997
2018-04-09 1 2018-04-09 0.000713 0.000713
2018-04-12 1 2018-04-12 0.000876 0.000876
2018-04-21 1 2018-04-21 0.004250 0.004250
我还希望在agr_signal
列中同时打印一次agr_signal1
:
BeginDate1 Consecutive1 EndDate1 end_price1 start_price1 agr_signal1
----------------------------------------------------------------------------
2018-03-22 3 2018-04-07 0.000795 0.000997 -1
2018-04-09 1 2018-04-09 0.000713 0.000713 0
2018-04-12 1 2018-04-12 0.000876 0.000876 1
2018-04-21 1 2018-04-21 0.004250 0.004250 -1
答案 0 :(得分:3)
我认为需要DataFrameGroupBy.agg
带有带有函数列表的列的字典,得到MultiIndex
,因此有必要用map
和最后rename
的列进行展平:
d = {'BeginDate':['first','last', 'size'],
'start_price':['first','last'],
'agr_signal':'first'}
df = df.groupby('agr_group').agg(d)
df.columns = df.columns.map('_'.join)
d = {'BeginDate_first':'BeginDate1',
'BeginDate_last':'EndDate1',
'BeginDate_size':'Consecutive1',
'start_price_first':'start_price1',
'start_price_last':'end_price1',
'agr_signal_first':'agr_signal1'}
df = df.reset_index().rename(columns=d)
print (df)
agr_group BeginDate1 EndDate1 Consecutive1 start_price1 end_price1 \
0 1.0 2018-03-22 2018-04-07 3 0.000997 0.000795
1 2.0 2018-04-09 2018-04-09 1 0.000713 0.000713
2 3.0 2018-04-12 2018-04-12 1 0.000876 0.000876
3 4.0 2018-04-21 2018-04-21 1 0.004250 0.004250
agr_signal1
0 -1
1 0
2 1
3 -1