2017-04-08 3 views
1

Ich versuche, Werte in Spalten einzuordnen und die Ränge den Werten aus der ersten Spalte ['Tickers'] zuzuweisen. Für einige Spalten möchte ich kleinere Werte einen höheren Rang und für ['Dividend'] würde Rang normalerweise und speichern vorzugsweise diejenigen Reihen in neuen Datenrahmen können also sagen, ich habe diese Datenrahmen:Rangfolge Datenrahmenspalten

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 

Zuerst habe ich fehlende Werte mit 0

ersetzen
df=df.replace('-',0) 

Dann würde ich sie Rang und neue Datenrahmen:

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

ich war th Einfärben über scipy Statistiken mit rankdata auf Spalten (dh: rankdata(df['P/E'], method='ordinal')), aber es gab einen Fehler zurück:

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

Haben Sie versucht, die ['.rank()'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rank.html) Methode für DataFrames verfügbar? – Craig

+1

Nebenbei: Die NavigableString-Erwähnung lässt mich glauben, dass Sie Daten von BeautifulSoup oder einem anderen Ort haben. Hast du HTML analysiert? Sie sollten sicherstellen, dass Sie Python-Zeichenfolgen (oder Zahlen, wenn die Zeichenfolgen Zahlen darstellen) anstelle von DataFrames verwenden. Andernfalls werden Sie ein seltsames Verhalten erhalten. – DSM

Antwort

1

Als @Craig said in the comment Sie DataFrame.rank(method='dense') Methode verwenden:

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

Erläuterung (Schritt für Schritt):

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

Sollte '' Coerce''-''Coerse'' nur zufällig funktionieren, wenn ich den Code richtig lese. – DSM

+0

@DSM, sicher, es ist ein Typ, danke! – MaxU

-1

Sie sollten die rank method:

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

Sie können dann die gewünschten Spalten auswählen und von dort aus Ihren neuen DataFrame erstellen.

Verwandte Themen