基于布尔条件切片pandas df

时间:2017-06-26 13:29:49

标签: pandas python-3.6

我有两只熊猫看起来像这样:

In [70]: print(r_ret.tail(2))
                 VTI       VOO       VGK       IEV       EWJ
2017-06-22  0.006919  0.028784 -0.269155 -0.707069 -0.223649
2017-06-23  0.089670  0.100813 -0.092122 -0.549094 -0.016048

In [71]: print(rnk.tail(2))
            VTI  VOO  VGK  IEV  EWJ
2017-06-22  2.0  1.0  4.0  5.0  3.0
2017-06-23  2.0  1.0  4.0  5.0  3.0

我想检查两个条件:

rnk < 4 and r_ret > 0

必需的输出:

2017-06-22  VTI  VOO
2017-06-23  VTI  VOO

基本上想要选择r_ret最高的r_ret的三个资产&gt; 0.如果有一种有效的方法可以在没有rnk df的情况下做到更好。

3 个答案:

答案 0 :(得分:1)

我认为您可以使用apply来比较每一行:

mask = (rnk < 4) & (r_ret > 0)
df = mask.apply(lambda x: ', '.join(x.index[x]), axis=1) \
         .rename_axis('date').reset_index(name='val')
print (df)
         date       val
0  2017-06-22  VTI, VOO
1  2017-06-23  VTI, VOO

答案 1 :(得分:1)

使用unstackapply

df[(df > 0) & (df.rank(axis=1, ascending=False) < 4)].unstack().dropna().rename_axis(['symbol', 'date']).reset_index().groupby(['date'])['symbol'].apply(lambda x: ' '.join(x))

答案 2 :(得分:1)

您可以在不使用apply的情况下执行此操作,这可以显着节省大于几行的数据帧:

pd.DataFrame(np.sort(((r_ret > 0)
                      & (r_ret.rank(axis=1, ascending=False) < 4)).values
                      * r_ret.columns.values)[:, -3:],
             index=r_ret.index)

Out[264]: 
           0    1    2
2017-06-22    VOO  VTI
2017-06-23    VOO  VTI