递增 pandas 数据框受面板中其他布尔数据框的影响

incrementally rank pandas dataframe subject to other boolean dataframe in panel

我在一个面板中有两个 pandas 数据框,我想创建第三个 df 对第一个 df(按行)进行排名,但只包括第二个 df 的相应元素为 True 的那些。一些示例数据来说明:

p['x']             
                   A         B         C         D         E
2015-12-31  0.957941 -0.686432  1.087717  1.363008 -1.528369
2016-01-31  0.079616  0.524744  1.675234  0.665511  0.023160
2016-02-29 -0.300144 -0.705346 -0.141015  1.341883  0.855853
2016-03-31  0.435728  1.046326 -0.422501  0.536986 -0.656256


p['y']
                A      B     C      D    E
2015-12-31   True  False  True  False  NaN
2016-01-31   True   True  True  False  NaN
2016-02-29  False   True  True   True  NaN
2016-03-31    NaN    NaN   NaN    NaN  NaN

我已经设法通过一些丑陋的 hack 来做到这一点,但仍然坚持这样一个事实,即 rank 不允许我对非数字数据使用 method='first'。我想为布尔 df 中没有 True 的任何单元格强制递增整数等级(即使重复)和 NaN。

输出应为以下形式:

              A    B    C    D   E
2015-12-31  2.0  NaN  1.0  NaN NaN
2016-01-31  3.0  2.0  1.0  NaN NaN
2016-02-29  NaN  3.0  2.0  1.0 NaN
2016-03-31  NaN  NaN  NaN  NaN NaN

我的破解尝试如下。它有效,尽管显然应该有更好的方法将 false 替换为 NaN。但是,一旦我添加 method='first' 它就不起作用,这是必要的,因为我可能有重复值的实例。

# I first had to hack a replacement of False with NaN.
# np.nan did not evaluate correctly
# I wasn't sure how else to specify pandas NaN
rank=p['Z'].replace(False,p['Z'].iloc[3,0])

# eliminate the elements without a corresponding True
rank=rank*p['X']

# then this works
p['rank'] = rank.rank(axis=1, ascending=False)

# but this doesn't
p['rank'] = rank.rank(axis=1, ascending=False, method='first')

如有任何帮助,我们将不胜感激! 谢谢

  1. 列表项
pd.DataFrame(np.where(p['y'] == True, p['x'], np.nan),
             p.major_axis, p.minor_axis).rank(1, ascending=False)