Ich habe einen solchen DataFrame:
df = pd.DataFrame(data={
'col0': [11, 22,1, 5]
'col1': ['aa:a:aaa', 'a:a', 'a', 'a:aa:a:aaa'],
'col2': ["foo", "foo", "foobar", "bar"],
'col3': [True, False, True, False],
'col4': ['elo', 'foo', 'bar', 'dupa']})
Ich möchte die Länge der Liste nach dem Teilen auf ":" in Spalte 1 erhalten, dann möchte ich die Werte überschreiben, wenn die Länge> 2 ist, oder die Werte nicht überschreiben, wenn die Länge <= 2 ist.
Idealerweise so schnell wie möglich in einer Zeile.
Derzeit versuche ich, aber es gibt ValueError zurück.
df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])
EDIT: Bedingung auf Spalte 1. EDIT2: Danke für all die tollen und schnell gegebenen Antworten. tolle! EDIT3: Timing in 10 ^ 6 Zeilen:
@ansev 3.2657s
@jezrael 0.8922s
@ anky_91 1.9511s
col2
odercol1
?Antworten:
Verwenden
Series.str.count
, Hinzufügen1
, VergleichenSeries.gt
und Zuweisen einer Liste zu gefilterten Spalten in der Liste:quelle
gt(1)
anstatt 1 und hinzuzufügengt(2)
?Sie müssen
series.str.len()
nach dem Aufteilen die Länge der Liste bestimmen, dann können Sie die Liste vergleichen und verwenden.loc[]
, wo immer die Bedingung übereinstimmt:quelle
Ein anderer Ansatz ist
Series.str.split
mitexpand = True
undDataFrame.count
mitaxis=1
.quelle