Mam takie 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']})
Chcę uzyskać długość listy po podzieleniu na „:” w kolumnie 1, a następnie chcę zastąpić wartości, jeśli długość> 2 LUB nie nadpisywać wartości, jeśli długość <= 2.
Najlepiej w jednej linii tak szybko, jak to możliwe.
Obecnie próbuję, ale zwraca ValueError.
df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])
EDYCJA: warunek na kolumnie 1. EDYCJA 2: dziękuję za wszystkie wspaniałe i szybko udzielone odpowiedzi. niesamowity! EDIT3: czas na 10 ^ 6 wierszy:
@ansev 3.2657s
@jezrael 0,8922s
@ anky_91 1.9511s
col2
czycol1
?Odpowiedzi:
Użyj
Series.str.count
, dodaj1
, porównajSeries.gt
i przypisz listę do filtrowanych kolumn na liście:źródło
gt(1)
zamiast dodania 1 igt(2)
?series.str.len()
Po podzieleniu musisz określić długość listy, a następnie możesz porównać i.loc[]
przydzielić, przypisać listę tam, gdzie spełniony jest warunek:źródło
Inne podejście jest
Series.str.split
zexpand = True
iDataFrame.count
zaxis=1
.źródło