Der folgende Code funktioniert nicht.
import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x'])
xLower = df["x"].map(lambda x: x.lower())
Wie soll ich es optimieren, um xLower = ['eins', 'zwei', np.nan] zu erhalten? Effizienz ist wichtig, da der reale Datenrahmen riesig ist.
python
string
pandas
missing-data
P. Scondido
quelle
quelle
str.casefold
für aggressivere Vergleiche von Faltstrings . Weitere Informationen in dieser Antwort .Antworten:
Verwenden Sie pandas- vektorisierte String-Methoden . wie in der Dokumentation:
.str.lower()
ist das allererste Beispiel dort;>>> df['x'].str.lower() 0 one 1 two 2 NaN Name: x, dtype: object
quelle
10000 loops, best of 3: 96.4 µs per loop
10000 loops, best of 3: 125 µs per loop
Eine andere mögliche Lösung für den Fall, dass die Spalte nicht nur Zeichenfolgen, sondern auch Zahlen enthält, ist die Verwendung
astype(str).str.lower()
oderto_string(na_rep='')
weil eine Zahl, wenn sie keine Zeichenfolge ist, wenn sie abgesenkt wirdNaN
, wird sie zurückgegeben :import pandas as pd import numpy as np df=pd.DataFrame(['ONE','Two', np.nan,2],columns=['x']) xSecureLower = df['x'].to_string(na_rep='').lower() xLower = df['x'].str.lower()
dann haben wir:
>>> xSecureLower 0 one 1 two 2 3 2 Name: x, dtype: object
und nicht
>>> xLower 0 one 1 two 2 NaN 3 NaN Name: x, dtype: object
bearbeiten:
Wenn Sie die NaNs nicht verlieren möchten, ist die Verwendung der Karte besser (aus @ wojciech-walczak und @ cs95 Kommentar). Sie sieht ungefähr so aus
xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)
quelle
Sie können dieses auch versuchen,
df= df.applymap(lambda s:s.lower() if type(s) == str else s)
quelle
type(s) == str
sollte stattdessen seinisinstance(s, str)
Eine mögliche Lösung:
import pandas as pd import numpy as np df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) xLower = df["x"].map(lambda x: x if type(x)!=str else x.lower()) print (xLower)
Und ein Ergebnis:
0 one 1 two 2 NaN Name: x, dtype: object
Ich bin mir jedoch nicht sicher über die Effizienz.
quelle
isinstance
wenn Sie den Typ eines Objekts überprüfen.Pandas> = 0,25: Fallunterscheidungen entfernen mit
str.casefold
Ab Version 0.25 empfehle ich die Verwendung der "vektorisierten" String-Methode,
str.casefold
wenn Sie mit Unicode-Daten arbeiten (sie funktioniert unabhängig von String oder Unicodes):s = pd.Series(['lower', 'CAPITALS', np.nan, 'SwApCaSe']) s.str.casefold() 0 lower 1 capitals 2 NaN 3 swapcase dtype: object
Siehe auch das zugehörige GitHub-Problem GH25405 .
casefold
eignet sich für einen aggressiveren Vergleich von Fällen. Es behandelt auch NaNs elegant (genau wiestr.lower
).Aber warum ist das besser?
Der Unterschied wird bei Unicodes gesehen. Nehmen Sie das Beispiel in den Python-
str.casefold
Dokumenten ,Vergleichen Sie die Ausgabe von
lower
für,s = pd.Series(["der Fluß"]) s.str.lower() 0 der fluß dtype: object
Versus
casefold
,s.str.casefold() 0 der fluss dtype: object
Siehe auch Python: lower () vs. casefold () bei der Zeichenfolgenübereinstimmung und Konvertierung in Kleinbuchstaben .
quelle
Möglicherweise wird das Listenverständnis verwendet
import pandas as pd import numpy as np df=pd.DataFrame(['ONE','Two', np.nan],columns=['Name']}) df['Name'] = [str(i).lower() for i in df['Name']] print(df)
quelle
Wenden Sie die Lambda-Funktion an
df['original_category'] = df['original_category'].apply(lambda x:x.lower())
quelle
Verwenden Sie die Apply-Funktion.
Xlower = df['x'].apply(lambda x: x.upper()).head(10)
quelle
(Efficiency is important since the real data frame is huge.)
und es noch einige Antworten gibt, versuchen Sie bitte herauszufinden, welche der gute Punkt Ihrer Antwort ist.Kopieren Sie Ihre Dataframe-Spalte und bewerben Sie sich einfach
df=data['x'] newdf=df.str.lower()
quelle