根据pandas数据框中的另一列重新整形列

时间:2017-08-20 23:57:40

标签: python pandas dataframe

Date          Sin      Ret
01/01/1990    True    0.03  
01/02/1990    True    0.02
01/01/1990    False   0.01  
01/02/1990    False   0.05  

我想

Date          Ret1    Ret2
01/01/1990    0.03    0.01
01/02/1990    0.02    0.05

这样我才能得到

Date          Ret1-Ret2
01/01/1990    0.02
01/02/1990    -0.03

最好的方法是什么?我当时正在考虑将日期和罪恶设定为指数并将其置于罪恶之中。有更简单的方法吗?

3 个答案:

答案 0 :(得分:3)

以下是df.set_indexdf.unstack的解决方案:

In [516]: df.set_index(['Date', 'Sin']).unstack(0).diff().iloc[-1]
Out[516]: 
     Date      
Ret  01/01/1990    0.02
     01/02/1990   -0.03
Name: True, dtype: float64

答案 1 :(得分:1)

我认为设置索引和堆叠是个好主意,但这里有一个替代方案:

(df.pivot(index='Date', columns='Sin', values='Ret')
   .rename(columns={True: 'Ret1', False: 'Ret2'}))

Sin         Ret1  Ret2
Date                  
01/01/1990  0.03  0.01
01/02/1990  0.02  0.05

答案 2 :(得分:1)

我的解决方案仅针对最终输出。

df.Sin=df.Sin.astype(int).replace({0:-1})
df.Ret=df.Sin.mul(df.Ret)
df.groupby('Date')['Ret'].agg({'Ret1-Ret2':'sum'})
            Ret1-Ret2
Date                 
01/01/1990       0.02
01/02/1990      -0.03