2017-04-08 72 views
1

我试图排列列中的值,并将排名分配到第一列['Tickers']的值。对于一些列我想排名较小值高和['Dividend']通常排名 ,最好保存在新的数据帧 的行列所以可以说我有这个数据帧:排名数据框列

Ticker P/E  P/S  P/B P/FCF Dividend 
No.      
1 NTCT 457.32 3.03 1.44 26.04 - 
2 GWRE 416.06 9.80 5.33 45.62 - 
3 PEGA 129.02 4.41 9.85 285.10 0.0128 
4 BLKB 87.68 4.96 14.36 41.81 0.0062 

首先,我用0

替换缺失值
df=df.replace('-',0) 

那我就对他们进行排名,并创造新的数据框:

Ticker P/E Dividend 
No.      
1 NTCT 4  3 
2 GWRE 3  3 
3 PEGA 2  1 
4 BLKB 1  2 

我是个墨有关使用SciPy的统计rankdata在列(即:rankdata(df['P/E'], method='ordinal')),但它返回的错误:

TypeError: '>' not supported between instances of 'int' and 'NavigableString' 
+2

您是否尝试过DataFrames可用的['.rank()'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rank.html)方法? – Craig

+1

另外:NavigableString的提到让我觉得你有从BeautifulSoup或某个地方进来的数据。你解析HTML吗?您应该确保在DataFrame中使用Python字符串(或数字,如果字符串表示数字),否则会出现一些奇怪的行为。 – DSM

回答

1

正如@Craig said in the comment您可以使用DataFrame.rank(method='dense')方法:

df.Dividend = pd.to_numeric(df.Dividend, errors='coerce').fillna(1) 
df[['Ticker']].join(df[['P/E','Dividend']].rank(method='dense')) 

说明(分步):

In [35]: df 
Out[35]: 
    Ticker  P/E P/S P/B P/FCF Dividend 
No. 
1  NTCT 457.32 3.03 1.44 26.04  - 
2  GWRE 416.06 9.80 5.33 45.62  - 
3  PEGA 129.02 4.41 9.85 285.10 0.0128 
4  BLKB 87.68 4.96 14.36 41.81 0.0062 

In [36]: df.Dividend = pd.to_numeric(df.Dividend, errors='coerce').fillna(1) 

In [37]: df 
Out[37]: 
    Ticker  P/E P/S P/B P/FCF Dividend 
No. 
1  NTCT 457.32 3.03 1.44 26.04 1.0000 
2  GWRE 416.06 9.80 5.33 45.62 1.0000 
3  PEGA 129.02 4.41 9.85 285.10 0.0128 
4  BLKB 87.68 4.96 14.36 41.81 0.0062 

In [38]: df[['Ticker']].join(df[['P/E','Dividend']].rank(method='dense')) 
Out[38]: 
    Ticker P/E Dividend 
No. 
1  NTCT 4.0  3.0 
2  GWRE 3.0  3.0 
3  PEGA 2.0  2.0 
4  BLKB 1.0  1.0 
+1

如果我正确地阅读了代码,应该是''coerce''''' coerse''只能作为一个漏洞意外工作。 – DSM

+0

@DSM,当然,这是一种类型,谢谢! – MaxU

-1

您应该使用rank method

df.rank(method='min', ascending=False) 

然后,你可以选择你想要的列,并从那里拿到它来制作新的DataFrame。