【问题标题】:Evaluating / ranking in Pandas dataframe在 Pandas 数据框中评估/排名
【发布时间】:2017-09-18 14:27:20
【问题描述】:

我有 Pandas DataFrame,我在其中导入了包含数百行的 Excel 电子表格。每行是一个公司名称,每列中有一些基本数据,如比率等。

Symbol  Name  P/BV  PE     NCB

A       AGT   4.382 42.59  0.0145

AAAP    AdvAc 6.91  NaN    -0.0003

AAME    AtlAm 0.6205 29.55 0.0089

AAN     Aaron 2.093 23.89  0.0213

等等。列更多,行更多,但我认为这足以说明数据。有时比率没有值,所以自动填充了 NaN 值。

我想做的是评估每家公司:

  • 每一列(例如 P/BV)是一个包含从最低到最高值的全域 - 创建 100 % 的范围。每家公司都将在新列中进行评估:我想为每家公司分配百分位排名 1 到 100。如果公司的 P/BV 比率在宇宙中最低的 1%,它将获得排名 100(因为这里最低是最好的)。最高比率获得排名 1。

  • 如果缺少值 - 存在 NaN - 分配等级 50

  • 我需要像这样评估每一列,所以我需要为每个比率列创建新列并用排名值填充它。

  • 某些比率在其值最高时是最好的,例如 NCB 列。

稍后我将在最后一列中添加每家公司的所有排名值,我可以管理它。我只是无法使这个排名起作用。有人可以帮帮我吗?

提前谢谢你:-)

【问题讨论】:

  • 到目前为止您尝试过什么?此外,对于那些不知道这些比率意味着什么的人,最好向我们提供所需的结果,以便我们知道您想要做什么
  • @MattR 好吧,我在那一刻停了下来,因为我意识到我对 Pandas 的了解不足以进入该排名。通常,假设列 P/BV 有 400 行,值例如从 0.00 到 100.00。然后从 0.00 到 1.00 的值在前 1% 中,所有在 P/BV 列中具有该值的公司将被分配排名 100。从 1.01 到 2.00 的值在 2% 中,具有该值的公司将是排名第 99 等。

标签: python pandas ranking


【解决方案1】:

这是一个使用类似数据的示例。在这个例子中:

  • 低 P/B & PE 获得高排名(逆排名)
  • 缺失值获得 50%(第 50 个百分位)
  • 高 MCV 获得高排名(直接排名)

示例数据帧:

  Symbol     P_BV     PE      NCB
0      A -0.59587  42.50 -1.42680
1      B  0.09875    NaN -0.82033
2      C  0.10987  29.55  0.73841
3      D  3.03278  23.89 -0.31283
4      E  0.70129  10.00 -1.00830

现在使用DataFrame.rank 和参数pct=True。稍微耗时的部分是您需要将它分别应用于不同的列,因为您想要对一些升序和一些降序进行排名。

new_df = df.copy()
new_df.loc[:, ['P_BV', 'PE']] = (df[['P_BV', 'PE']]
                                     .rank(pct=True, ascending=False) * 100)
new_df.loc[:, 'NCB'] = df['NCB'].rank(pct=True) * 100  # ascending=True

最后,用 50 填充 NaN 值:

new_df.fillna(value=50., inplace=True)

您的结果如下所示:

  Symbol   P_BV     PE    NCB
0      A  100.0   25.0   20.0
1      B   80.0   50.0   60.0
2      C   60.0   50.0  100.0
3      D   20.0   75.0   80.0
4      E   40.0  100.0   40.0

您需要的组合代码:

new_df = df.copy()
new_df.loc[:, ['P_BV', 'PE']] = (df[['P_BV', 'PE']]
                                     .rank(pct=True, ascending=False) * 100)
new_df.loc[:, 'NCB'] = df['NCB'].rank(pct=True) * 100  # ascending=True
new_df.fillna(value=50., inplace=True)

【讨论】:

  • 谢谢@Brad 第一部分对我来说非常有效,但第二部分 ascending=True 不起作用。它给出了一个错误,但我使用我的 Excel 文件将数据加载到 Pandas DataFrame:TypeError Traceback(最近一次调用最后一次)TypeError:'>'在'float'和'str'的实例之间不支持上述异常是直接原因以下异常: SystemError Traceback (最近一次调用最后一次) SystemError: at 0x10a86edf0> 返回了带有错误集的结果
  • @MichalŠplho df.NCB.dtype 给你什么?列中是否有任何字符串或非常大/非常小的数字?试试new_df.loc[:, 'NCB'] = pd.to_numeric(df['NCB']).rank(pct=True) * 100
  • @BradSolomon我在该列中有几个字符串,例如:-1.85K,(4650 中大约有 5 个),这导致了错误消息。您的最后一个代码帮助我检测了字符串的位置,它总是显示错误,但显示了字符串在列中的位置。我更正了数据,现在你的原始代码就像瑞士手表一样工作:-) 非常感谢:-)
猜你喜欢
  • 2018-05-11
  • 2022-11-13
  • 1970-01-01
  • 2019-06-18
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多