Удаление строки DataFrame в Pandas на основе значения столбца
У меня есть следующий 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
. Каков самый эффективный способ сделать это?
5 ответ(ов)
Если я правильно понимаю, это должно быть так же просто, как:
df = df[df.line_race != 0]
Для любых будущих пользователей, которые столкнутся с этой проблемой, стоит упомянуть, что конструкция df = df[df.line_race != 0]
работает корректно, когда вы фильтруете значения, не равные 0
, но не несет смысла, если вы хотите отфильтровать None
или пропущенные значения.
Работает:
df = df[df.line_race != 0]
Не работает как ожидается:
df = df[df.line_race != None]
Работает:
df = df[df.line_race.notnull()]
Таким образом, для фильтрации пропущенных значений настоятельно рекомендуется использовать метод .notnull()
.
Чтобы добавить еще одно решение, особенно если вы используете новые ассессоры pandas, другие решения могут заменить оригинальный DataFrame и потерять ассессоры. Вот пример кода, который позволит вам удалить строки с нулевыми значениями в столбце line_race
, не теряя при этом ассессоры:
df.drop(df.loc[df['line_race'] == 0].index, inplace=True)
Этот подход удаляет все строки, где значение в колонке line_race
равно 0, и при этом сохраняет ваши ассессоры в DataFrame.
В случае работы с несколькими значениями в столбце с типом данных str
, вы можете использовать следующую функцию для фильтрации строк:
def filter_rows_by_values(df, col, values):
return df[~df[col].isin(values)]
В качестве примера, если у вас есть DataFrame, и вы хотите удалить строки, в которых значения "b" и "c" находятся в столбце "str", вы можете сделать это следующим образом:
import pandas as pd
df = pd.DataFrame({"str": ["a","a","a","a","b","b","c"], "other": [1,2,3,4,5,6,7]})
print(df)
# Вывод DataFrame до фильтрации
# str other
# 0 a 1
# 1 a 2
# 2 a 3
# 3 a 4
# 4 b 5
# 5 b 6
# 6 c 7
filtered_df = filter_rows_by_values(df, "str", ["b","c"])
print(filtered_df)
# Вывод DataFrame после фильтрации
# str other
# 0 a 1
# 1 a 2
# 2 a 3
# 3 a 4
Результат будет таким:
str other
0 a 1
1 a 2
2 a 3
3 a 4
Эта функция эффективно удаляет все строки, у которых в столбце "str" находятся запрещенные значения "b" и "c".
Если вы хотите удалить строки на основе нескольких значений столбца, вы можете использовать следующий код:
df = df[(df.line_race != 0) & (df.line_race != 10)]
Этот код удалит все строки, где значение в столбце line_race
равно 0 или 10.
Как выбрать строки из DataFrame на основе значений столбцов?
Создание DataFrame в Pandas путём последовательного добавления строк
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas
Получение списка из заголовков столбцов DataFrame в Pandas