Как я могу удалить несколько строк из моего фрейма данных?

#python #dataframe #drop

#python #фрейм данных #удаление

Вопрос:

У меня есть фрейм данных (называемый my_df 1), и я хочу удалить несколько строк на основе определенных дат. Как я могу создать новый фрейм данных (my_df 2) без дат «2020-05-01» и «2020-05-04»?

Я попробовал следующее, которое не сработало, как вы можете видеть ниже:

 my_df2 = mydf_1[(mydf_1['Date'] != '2020-05-01') | (mydf_1['Date'] != '2020-05-04')] 
my_df2.head()
  

введите описание изображения здесь

Комментарии:

1. mydf_1.loc[your boolean_stuff] подойдет. mydf_1[...] обращается к столбцам, mydf_1.loc[...] обращается к строкам. Кроме того, вы захотите соединить свои логические запросы с помощью амперсанда amp; вместо канала | . Канал эквивалентен or , и каждая дата не будет первым или четвертым мая

2. Что я должен ввести в [ваш boolean_stuff]? Я попробовал mydf_1.loc[‘Date’ = ‘2020-05-01’]

3. (mydf_1['Date'] != '2020-05-01') amp; (mydf_1['Date'] != '2020-05-04')

Ответ №1:

Проблема, похоже, в вашем логическом операторе. Вы должны использовать and здесь вместо or , поскольку вам нужно выбрать все строки, которые не являются 2020-05-01 и 2020-05-04 .

Побитовые операторы не будут закорачиваться, и, следовательно, результат.

Ответ №2:

Вы можете использовать isin со знаком отрицания ~ :

 dates=['2020-05-01', '2020-05-04']
my_df2 = mydf_1[~mydf_1['Date'].isin(dates)] 
  

Ответ №3:

Краткое объяснение вашей ошибки И и ИЛИ было адресовано kanmaytacker. Следуя нескольким дополнительным рекомендациям:

Индексирование в pandas:

По метке .loc
По индексу .iloc

By label также работает без .loc , но это медленнее, поскольку оно состоит из последовательных операций вместо одной внутренней операции, состоящей из вложенных циклов (см. Здесь). Кроме того, с .loc вы можете выбирать более чем по одной оси одновременно.

 # example with rows. Same logic for columns or additional axis.
df.loc[(df['a']!=4) amp; (df['a']!=1),:] # ".loc" is the only addition
>>>
   a  b  c
2  0  4  6
  

Ваш индекс является логическим набором. Это верно для numpy и, как следствие, для pandas тоже.

 (df['a']!=4) amp; (df['a']!=1)
>>>
0    False
1    False
2     True
Name: a, dtype: bool