Удаление строк на основе столбца данных панд условия - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующие данные:

df = pd.DataFrame({ 'Column_A': [1,2,3,4],
                'Column_B': [["X1", "X2", "Y1"],
                            ["X3", "Y2"],
                            ["X4", "X5"],
                            ["X5", "Y3", "Y4"]],})

   Column_A      Column_B
0         1  [X1, X2, Y1]
1         2      [X3, Y2]
2         3      [X4, X5]
3         4  [X5, Y3, Y4]

Я хочу удалить все строки, начинающиеся с Y, во втором столбце.Желаемый вывод:

   Column_A  Column_B
0         1  [X1, X2]
1         2      [X3]
2         3  [X4, X5]
3         4      [X5]

1 Ответ

0 голосов
/ 23 ноября 2018

Используйте понимание вложенного списка с фильтрацией с помощью startswith:

df['Column_B'] = [[y for y in x if not y.startswith('Y')] for x in df['Column_B']]

apply, альтернатива:

df['Column_B'] = df['Column_B'].apply(lambda x: [y for y in x if not y.startswith('Y')])

Или используйте filter:

df['Column_B'] = [list(filter(lambda y: not y.startswith('Y'), x)) for x in df['Column_B']]

print (df)
   Column_A  Column_B
0         1  [X1, X2]
1         2      [X3]
2         3  [X4, X5]
3         4      [X5]

Производительность :

Зависит от количества строк, количества значений в списках и количества совпадающих значений:

#[40000 rows x 2 columns]
df = pd.concat([df] * 10000, ignore_index=True)
#print (df)


In [142]: %timeit df['Column_B'] = [[y for y in x if not y.startswith('Y')] for x in df['Column_B']]
23.7 ms ± 410 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [143]: %timeit df['Column_B'] = [list(filter(lambda y: not y.startswith('Y'), x)) for x in df['Column_B']]
36.5 ms ± 204 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [144]: %timeit df['Column_B'] = df['Column_B'].apply(lambda x: [y for y in x if not y.startswith('Y')])
30.4 ms ± 1.86 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...