【问题标题】:How to get the Rank of current row compared to previous rows如何获得当前行与前一行相比的排名
【发布时间】:2019-02-17 13:44:07
【问题描述】:

如何获取当前行与前一行的排名

我有一个像这样的数据框:

Instru Price Volume
ABCD   1000  100258
ABCD   1000  100252
ABCD   1000  100168
ABCD   1000  100390
ABCD   1000  100470
ABCD   1000  100420

我想获取当前行与 Volume Column 的所有先前行相比的排名。

所需的数据框数据:

Instru Price Volume  Rank
ABCD   1000  100258  1     => 1st Row so Rank 1
ABCD   1000  100252  2     => Rank 2 (Compare 100258,100252)
ABCD   1000  100168  3     => Rank 3 (Compare 100258,100252,100168)
ABCD   1000  100390  1     => Rank 1 (Compare 100390,100258,100252,100168)
ABCD   1000  100470  1     => Rank 1 (Compare 100470,100390,100258,100252,100168)
ABCD   1000  100420  2     => Rank 2 (Compare 100470,100420,100390,100258,100252,100168)

pandas.DataFrame.rank 函数不符合我的目的。

【问题讨论】:

  • 请详细说明排名功能,我不明白您希望排名如何工作
  • 为了更清晰,我已经编辑了我想要的数据框。

标签: python python-3.x pandas dataframe


【解决方案1】:

累积排序之后使用np.searchsorted

df['Rank'] = np.array([i - np.searchsorted(sorted(df.Volume[:i]), v) for i, v in enumerate(df.Volume)]) + 1
print(df)

输出

  Instru  Price  Volume  Rank
0   ABCD   1000  100258     1
1   ABCD   1000  100252     2
2   ABCD   1000  100168     3
3   ABCD   1000  100390     1
4   ABCD   1000  100470     1
5   ABCD   1000  100420     2

【讨论】:

  • 如果有多个 Instru.我的意思是如何申请 groupby('Instru')
【解决方案2】:

我想不出只使用 pandas 函数的方法。但是迭代计算这样的排名非常容易:

df["rank"] = [df.iloc[0:(i+1)]["Volume"].le(df.iloc[i]["Volume"]).sum() for i in range(len(df))]

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多