Ich filtere gerne Daten heraus, deren Stringlänge ungleich 10 ist.
Wenn ich versuche, eine Zeile herauszufiltern, deren Zeichenfolgenlänge in Spalte A oder B nicht gleich 10 ist, habe ich dies versucht.
df=pd.read_csv('filex.csv')
df.A=df.A.apply(lambda x: x if len(x)== 10 else np.nan)
df.B=df.B.apply(lambda x: x if len(x)== 10 else np.nan)
df=df.dropna(subset=['A','B'], how='any')
Dies funktioniert langsam, funktioniert aber.
Es kann jedoch manchmal zu Fehlern kommen, wenn die Daten in A keine Zeichenfolge, sondern eine Zahl sind (interpretiert als Zahl, wenn read_csv die Eingabedatei liest).
File "<stdin>", line 1, in <lambda>
TypeError: object of type 'float' has no len()
Ich glaube, stattdessen sollte es effizienteren und eleganteren Code geben.
Basierend auf den Antworten und Kommentaren unten sind die einfachsten Lösungen, die ich gefunden habe:
df=df[df.A.apply(lambda x: len(str(x))==10]
df=df[df.B.apply(lambda x: len(str(x))==10]
oder
df=df[(df.A.apply(lambda x: len(str(x))==10) & (df.B.apply(lambda x: len(str(x))==10)]
oder
df=df[(df.A.astype(str).str.len()==10) & (df.B.astype(str).str.len()==10)]
Wenn Sie Zahlen in Zeilen haben, werden diese als Gleitkommazahlen konvertiert.
Konvertieren Sie alle Zeilen nach dem Import aus Lebensläufen in Zeichenfolgen. Teilen Sie diese Lambdas für eine bessere Leistung in mehrere Threads auf.
quelle
Sie können verwenden
df.apply(len)
. es wird Ihnen das Ergebnis gebenquelle
Filtere andere Werte als die Länge von 10 aus Spalte A und B heraus. Hier übergebe ich den Lambda-Ausdruck an die Funktion map (). Die Funktion map () gilt immer für Serienobjekte.
df = df[df['A'].map(lambda x: len(str(x)) == 10)] df = df[df['B'].map(lambda x: len(str(x)) == 10)]
quelle