如何基于python中另一个df的值过滤df

时间:2018-09-26 17:49:33

标签: python pandas

我有2个包含数据的df,索引是日期

dfcarry = {'EUR3m3m': [1.5, 0.6, 1.7, 1.5, -1.2],
           'EUR6m3m': [2.0, 1.2, 1.3, 0.6, -1.7],
         'EUR6m3m3m': [1.3, 1.0, -1.4, 0.5, np.nan]}
dfcarry = pd.DataFrame(dfcarry, index=['26-09-2016','25-09-2016','24-09-2016','23-09-2016'])

dfflags = {'EUR3m3m': [1, 0, 1, 1, -1],
           'EUR6m3m': [1, 1, 1, 0, -1],
         'EUR6m3m3m': [1, 1, -1, 0, 0]}
dfflags = pd.DataFrame(dfflags, index=['26-09-2016','25-09-2016','24-09-2016','23-09-2016'])

现在,我要做的是将数字总和的 abs 值限制为1,因此对于任何给定的日期,我在同一方向上最多只能有2个标志,即1抵消了-1:

if abs(sum(dfflags['26-09-2016'])) > 1:
    then convert one of the flags to zero

然后,我要去除的整数是相应的绝对(进位)数最小的值。如果我们有太多1,我们将舍弃进位号最少的1。如果我们的标志中有太多的-1,我们将摆脱一个-1的进位数字最高(最小-ve)

在我的随身携带的df中,我有一些nan(故意)。

我该怎么做?

因此请注意,对于第一个日期“ 2016年9月26日”,预期输出为1,保持为600万欧元3m,因为我将1对应于最高进位绝对值(因此,我保持进位= 2.0,并摆脱进位= 1.5和1.3)。

总体预期输出为

dfflags = {'EUR3m3m': [0, 0, 1, 1, 0],
         'EUR6m3m':   [1, 1, 1, 0, -1],
         'EUR6m3m3m': [0, 0, -1, 0, 0]}

谢谢

1 个答案:

答案 0 :(得分:0)

编辑:考虑了Coldsteel指出的标志的ABS总和

n = 2 #how many flags can be maximum equal to 1
df = abs(dfflags) * dfcarry
for col in df.columns: #for each column, set the flags
    if sum(dfflags[col]) > n:
        n_new = n + 2 * len(dfflags[dfflags[col] == -1])
        threshold = min(df[col].nlargest(n=n_new))
        df[col] = np.where(df[col] >= threshold,1,0)
    else:
        df[col] = abs(dfflags[col])
dfflags = dfflags[df == 1].fillna(0) #apply the 'filter df' to the dfflags, only keeping the top n 1 in each column

结果

_________ EUR3m3m EUR6m3m EUR6m3m3m 26-09-2016 0.0 1.0 0.0 25-09-2016 0.0 0.0 1.0 24-09-2016 1.0 1.0 -1.0 23-09-2016 1.0 0.0 0.0 22-09-2016 0.0 0.0 0.0

悬而未决的问题:按给定值或绝对值对进位进行排序?