У меня есть такой 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']})
Я хочу получить длину списка после разделения на ":" в столбце col1, затем я хочу перезаписать значения, если длина> 2 ИЛИ не перезаписать значения, если длина <= 2.
В идеале в одну строчку максимально быстро.
В настоящее время я пытаюсь, но он возвращает ValueError.
df[['col1', 'col2', 'col3']] = df.loc[df['col1'].str.split(":").apply(len) > 2], ("", "", False), df[['col1', 'col2', 'col3']])
РЕДАКТИРОВАТЬ: состояние на col1. EDIT2: спасибо за все великолепные и быстро предоставленные ответы. удивительно! РЕДАКТИРОВАТЬ3: время на 10 ^ 6 строк:
@ansev 3.2657s
@jezrael 0.8922s
@ anky_91 1.9511s
col2
илиcol1
?Ответы:
Используйте
Series.str.count
, добавляйте1
, сравнивайтеSeries.gt
и назначайте список отфильтрованным столбцам в списке:источник
gt(1)
вместо добавления 1 иgt(2)
?Вам нужно
series.str.len()
после разделения определить длину списка, затем вы можете сравнить и, используя.loc[]
, назначить список там, где соответствует условие:источник
Другой подход
Series.str.split
сexpand = True
иDataFrame.count
сaxis=1
.источник