在Pandas数据框中评估/排名

时间:2017-09-18 14:27:21

标签: python pandas ranking

我有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)是一个包含从最低到最高值的Universe - 创建100%的范围。每个公司都将在新栏目中进行评估:我想为每个公司1到100分配百分位数排名。如果公司的P / BV比率在宇宙的最低1%,它会得到排名100(这里最低是最好的) )。最高比率获得等级1.

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

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

  • 某些比率在其值最高时最佳,如NCB列。

稍后我会在最后一栏中添加每个公司的所有排名值,我可以管理。我只是不能让这个排名工作。有人能帮助我吗?

提前谢谢: - )

1 个答案:

答案 0 :(得分:1)

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

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

示例DataFrame:

  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

最后,将NaN值填入50:

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)