递增 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')
如有任何帮助,我们将不胜感激!
谢谢
- 列表项
pd.DataFrame(np.where(p['y'] == True, p['x'], np.nan),
p.major_axis, p.minor_axis).rank(1, ascending=False)
我在一个面板中有两个 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')
如有任何帮助,我们将不胜感激! 谢谢
- 列表项
pd.DataFrame(np.where(p['y'] == True, p['x'], np.nan),
p.major_axis, p.minor_axis).rank(1, ascending=False)