【发布时间】:2016-08-04 04:49:59
【问题描述】:
我在一个面板中有两个 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
我已经设法通过一些丑陋的黑客来做到这一点,但仍然坚持这样一个事实,即 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
我的黑客尝试如下。它有效,尽管显然应该有更好的方法来用 NaN 替换 false。但是,一旦我添加 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')
任何帮助将不胜感激! 谢谢
- 列表项
【问题讨论】:
-
你能分享第三个df的期望结果吗...到目前为止你的代码是什么