У меня есть следующий DataFrame:
daysago line_race rating rw wrating
line_date
2007-03-31 62 11 56 1.000000 56.000000
2007-03-10 83 11 67 1.000000 67.000000
2007-02-10 111 9 66 1.000000 66.000000
2007-01-13 139 10 83 0.880678 73.096278
2006-12-23 160 10 88 0.793033 69.786942
2006-11-09 204 9 52 0.636655 33.106077
2006-10-22 222 8 66 0.581946 38.408408
2006-09-29 245 9 70 0.518825 36.317752
2006-09-16 258 11 68 0.486226 33.063381
2006-08-30 275 8 72 0.446667 32.160051
2006-02-11 475 5 65 0.164591 10.698423
2006-01-13 504 0 70 0.142409 9.968634
2006-01-02 515 0 64 0.134800 8.627219
2005-12-06 542 0 70 0.117803 8.246238
2005-11-29 549 0 70 0.113758 7.963072
2005-11-22 556 0 -1 0.109852 -0.109852
2005-11-01 577 0 -1 0.098919 -0.098919
2005-10-20 589 0 -1 0.093168 -0.093168
2005-09-27 612 0 -1 0.083063 -0.083063
2005-09-07 632 0 -1 0.075171 -0.075171
2005-06-12 719 0 69 0.048690 3.359623
2005-05-29 733 0 -1 0.045404 -0.045404
2005-05-02 760 0 -1 0.039679 -0.039679
2005-04-02 790 0 -1 0.034160 -0.034160
2005-03-13 810 0 -1 0.030915 -0.030915
2004-11-09 934 0 -1 0.016647 -0.016647
Мне нужно удалить строки, где line_race
равно 0
. Какой самый эффективный способ сделать это?
Ответы:
Если я правильно понимаю, это должно быть так просто:
источник
df
большой? Или я могу сделать это на месте?df
с 2M строками, и все прошло довольно быстро.df = df[df['line race'] != 0]
df=df[~df['DATE'].isin(['2015-10-30.1', '2015-11-30.1', '2015-12-31.1'])]
Но для любых будущих прохожих вы могли бы упомянуть, что
df = df[df.line_race != 0]
ничего не делает при попытке фильтрацииNone
/ пропущенных значений.Работает:
Ничего не делает
Работает:
источник
df = df[df.columns[2].notnull()]
, но так или иначе вам нужно каким-то образом индексировать столбец.df = df[df.line_race != 0]
удаляет строки, но также не сбрасывает индекс. Поэтому, когда вы добавляете еще одну строку в df, она может не добавляться в конце. Я бы рекомендовал сбросить индекс после этой операции (df = df.reset_index(drop=True)
)==
оператором для запуска. stackoverflow.com/questions/3257919/…Лучший способ сделать это с помощью логического маскирования:
ОБНОВЛЕНИЕ: Теперь, когда панды 0.13 вышли, еще один способ сделать это
df.query('line_race != 0')
.источник
query
. Это позволяет использовать более богатые критерии выбора (например, операции, подобные set, например,df.query('variable in var_list')
где 'var_list' - список желаемых значений)query
не очень полезно, если в имени столбца есть пробел.df = df.rename(columns=lambda x: x.strip().replace(' ','_'))
просто чтобы добавить другое решение, особенно полезное, если вы используете новые оценщики панд, другие решения заменят оригинальные панды и потеряют оценщиков
источник
.reset_index()
бы, если бы кто-то заканчивал тем, что использовал индексныеЕсли вы хотите удалить строки на основе нескольких значений столбца, вы можете использовать:
Сбросить все строки со значениями 0 и 10 для
line_race
.источник
drop = [0, 10]
а затем что-то вродеdf[(df.line_race != drop)]
Данный ответ, тем не менее, является правильным, как кто-то выше сказал, что вы можете использовать,
df.query('line_race != 0')
что в зависимости от вашей проблемы гораздо быстрее. Настоятельно рекомендую.источник
DataFrame
имена переменных, как я (и, рискну предположить, все по сравнению сdf
используемыми для примеров), потому что вы должны написать это только один раз.Хотя предыдущий ответ почти аналогичен тому, что я собираюсь сделать, но использование метода индекса не требует использования другого метода индексации .loc (). Это можно сделать аналогично, но точно так же, как
источник
Еще один способ сделать это. Возможно, это не самый эффективный способ, так как код выглядит немного сложнее, чем код, упомянутый в других ответах, но все же альтернативный способ сделать то же самое.
источник
Я скомпилировал и запустил свой код. Это точный код. Вы можете попробовать это самостоятельно.
Если у вас есть какой-либо специальный символ или пробел в имени столбца, вы можете написать его так,
''
как показано в следующем коде:Если есть только одно строковое имя столбца без пробелов или специальных символов, вы можете получить к нему прямой доступ.
источник
Просто добавив еще один способ для DataFrame, расширенный по всем столбцам:
Пример:
источник