2017-08-02 2 views
1

Ich habe einen df 'XLK' genannt:Zeichen numerische Werte in einem Datenrahmen Konvertieren

 Market Cap PE 
AAN  3.25B  23.6 
AAPL 819.30B 18.44  
ACFN 6.18M  2.1 
ACIW 2.63B  103.15 

Ich möchte nur die Marktkapitalisierung für Werte> 100 Millionen, so erwartete Ausgabe ist:

 Market Cap PE 
AAN  3.25B  23.6 
AAPL 819.30B 18.44  
ACIW 2.63B  103.15 

ich habe versucht, ohne Erfolg die Briefe an die entsprechenden 0'en Umwandlung:

XLK['Market Cap'].replace('M','000000') 
XLK.drop[XLK_quote['Market Cap'] < '100M'].index 
+0

Werden Sie an, dass ... ein exaktes Duplikat suchen. –

Antwort

5

Verwendung replace mit regex=True und verwenden Sie Ersatzzeichenfolgen, die die wissenschaftliche Notation emulieren. Dann verwenden Sie astype(float) oder pd.to_numeric.

df[df.Market_Cap.replace(dict(B='E9', M='E6'), regex=True).astype(float) >= 100E6] 

    Market_Cap  PE 
AAN  3.25B 23.60 
AAPL 819.30B 18.44 
ACIW  2.63B 103.15 

Gleichwertig

dct = dict(B='E9', M='E6') 
num = pd.to_numeric(df.Market_Cap.replace(dct, regex=True), 'coerce') 
df[num >= 100E6] 
+0

Ich bekomme ValueError: Konnte Zeichenfolge in Float nicht konvertieren: N/A .... gibt es eine Möglichkeit, Nan-Werte zu ignorieren? –

+0

es gibt 500 Zeilen in der DF, rate theres, das ist NA –

+0

Ich aktualisierte die zweite Version mit 'pd.to_numeric', um eine Parametereinstellung einzuschließen, die Dinge erzwingt, die nicht zu' np.nan' analysiert werden können. Es sollte jetzt mit "NA" funktionieren. – piRSquared

2

Alternativ geben Sie eine mapping und dann mit str.map ersetzen:

In [723]: mapping 
Out[723]: {'B': 1000000000, 'K': 1000, 'M': 1000000} 

In [724]: df[df['Market Cap'].str[:-1].astype(float) * df['Market Cap'].str[-1].map(mapping) > 100e6] 
Out[724]: 
    Market Cap  PE 
AAN  3.25B 23.60 
AAPL 819.30B 18.44 
ACIW  2.63B 103.15 
Verwandte Themen