10

Удаление строки DataFrame в Pandas на основе значения столбца

14

У меня есть следующий 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 ответ(ов)

15

Если я правильно понимаю, это должно быть так же просто, как:

df = df[df.line_race != 0]
3

Для любых будущих пользователей, которые столкнутся с этой проблемой, стоит упомянуть, что конструкция 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().

1

Чтобы добавить еще одно решение, особенно если вы используете новые ассессоры pandas, другие решения могут заменить оригинальный DataFrame и потерять ассессоры. Вот пример кода, который позволит вам удалить строки с нулевыми значениями в столбце line_race, не теряя при этом ассессоры:

df.drop(df.loc[df['line_race'] == 0].index, inplace=True)

Этот подход удаляет все строки, где значение в колонке line_race равно 0, и при этом сохраняет ваши ассессоры в DataFrame.

0

В случае работы с несколькими значениями в столбце с типом данных 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".

0

Если вы хотите удалить строки на основе нескольких значений столбца, вы можете использовать следующий код:

df = df[(df.line_race != 0) & (df.line_race != 10)]

Этот код удалит все строки, где значение в столбце line_race равно 0 или 10.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь