根据布尔条件切片 pandas df
slicing pandas df based on boolean condition
我有两个 pandas df 看起来像这样:
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
基本上想要 select 具有最高 r_ret 的三个资产,其 r_ret > 0。如果没有 rnk df 有一种有效的方法来做到这一点,那就是更好。
我认为您可以使用 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
使用 unstack
和 apply
:
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))
您可以在不使用 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
我有两个 pandas df 看起来像这样:
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
基本上想要 select 具有最高 r_ret 的三个资产,其 r_ret > 0。如果没有 rnk df 有一种有效的方法来做到这一点,那就是更好。
我认为您可以使用 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
使用 unstack
和 apply
:
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))
您可以在不使用 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