我有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列。
稍后我会在最后一栏中添加每个公司的所有排名值,我可以管理。我只是不能让这个排名工作。有人能帮助我吗?
提前谢谢: - )
答案 0 :(得分:1)
这是使用类似数据的示例。在这个例子中:
示例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)