熊猫数据框分组依据功能用法

时间:2018-07-13 11:45:13

标签: python python-3.x pandas

我有pandas df,我试图在其中按'agr_group'对其进行分组。 'agr_group'只是使用agr_signaldiff函数的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

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