【问题标题】:incrementally rank pandas dataframe subject to other boolean dataframe in panel根据面板中的其他布尔数据框对熊猫数据框进行递增排名
【发布时间】: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')

任何帮助将不胜感激! 谢谢

  1. 列表项

【问题讨论】:

  • 你能分享第三个df的期望结果吗...到目前为止你的代码是什么

标签: python pandas nan rank


【解决方案1】:
pd.DataFrame(np.where(p['y'] == True, p['x'], np.nan),
             p.major_axis, p.minor_axis).rank(1, ascending=False)

【讨论】:

  • 非常感谢,一旦我将 method='first' 添加到 rank 参数中,它就可以完成工作。由于某种原因,“第一个”参数不适用于我的(丑陋的)实现。
  • 很高兴我能帮上忙。
  • @piRSquared 我首先认为你可以省略=Truenp.where(p['y'], p['x'], np.nan),但它会填充 NaN ;),因此无法删除。
  • @jezrael 我试过了。例如这里是np.where(p['y'], p['x'], np.nan)[-1, :] = array([ 0.435728, 1.046326, -0.422501, 0.536986, -0.656256])
  • @jezrael 或更好的例子:np.where(np.nan, 1, 0)
猜你喜欢
  • 2022-08-17
  • 2019-12-09
  • 2014-12-29
  • 2022-11-02
  • 2012-06-19
  • 2015-11-06
  • 1970-01-01
  • 2017-01-14
  • 2021-04-06
相关资源
最近更新 更多