2017-04-08 76 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。