Я хочу удалить строку фрейма данных Pandas, которая соответствует строке, и сохранить индекс

#python #python-3.x #pandas #dataframe

Вопрос:

У меня есть фрейм данных с именем last_modified_tracking_df, в котором есть столбцы как —> Исходный файл,Last_modified_date и Целевая папка.

У меня есть словарь last_modified_file_date_dict, в котором имена файлов типов указаны в ключах. Я хочу удалить строки из last_modified_tracking_df, файлы которых не существуют в last_modified_tracking_df.

Я написал для этого приведенный ниже код—>

     for log_path in last_modified_tracking_df['Source file']:
                if log_path not in last_modified_file_date_dict.keys():
                    last_modified_tracking_df = last_modified_tracking_df[last_modified_tracking_df['Source file'].ne(log_path)]
print(last_modified_tracking_df)
 

Этот код удаляет необходимые строки, но вывод приходит в виде

 0   C:testfile1...  2021-07-05T10:38:58   target1
1   C:testfile2...  2021-10-20T09:18:43   target2
3   C:testfile4...  2021-10-21T04:54:37   target4
4   C:testfile5...  2021-10-18T13:28:16   target5
 

В приведенном выше выводе индекс пропускается для удаленной строки. Мой вопрос: «есть ли более эффективный подход для этого?» и «как я могу получить последовательные индексы даже после удаления строк?» Пожалуйста, помогите!

Ответ №1:

В качестве альтернативы вы можете полностью избавиться от цикла и использовать isin вместо ne

Итак, предполагая, что у вас есть

 >>> last_modified_tracking_df
     source_file   last_modified_date target_folder
0  C:testfile1  2021-07-05T10:38:58       target1
1  C:testfile2  2021-10-20T09:18:43       target2
2  C:testfile3  2021-10-18T13:28:16       target3
3  C:testfile4  2021-10-21T04:54:37       target4
4  C:testfile5  2021-10-18T13:28:16       target5
5  C:testfile6  2021-10-18T13:28:16       target6


 

И

 >>> last_modified_file_date_dict
{'C:\test\file1': '2021-07-05T10:38:58',
 'C:\test\file3': '2021-10-21T04:54:37'}

 

Просто позвонить

 last_modified_tracking_df = last_modified_tracking_df[
    last_modified_tracking_df["source_file"].isin(last_modified_file_date_dict.keys())
].reset_index(drop=True)
 

Результат

 >>> last_modified_tracking_df
     source_file   last_modified_date target_folder
0  C:testfile1  2021-07-05T10:38:58       target1
1  C:testfile3  2021-10-18T13:28:16       target3
 

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

1. если я хочу проверить и сохранить отрицание, вместо isin, какой метод я могу использовать?

2. Вы можете просто отрицать целое выражение с ~ помощью символа, чтобы ~last_modified_tracking_df["source_file"].isin(last_modified_file_date_dict.keys())

Ответ №2:

Используя DataFrame.reset_index(drop=True) works и предполагая, что вы не хотите переназначать фрейм данных для новой переменной, вы также захотите inplace=True

 last_modified_tracking_df.reset_index(drop=True, inplace=True)
 

В противном случае, если бы вы хотели переназначиться, вы бы пошли на

 new_df = last_modified_tracking_df.reset_index(drop=True)
 

Это сбрасывает и присваивает каждой строке последовательное значение индекса по отношению к значению индекса предыдущей строки.

Что касается проверки значений строки, вы, вероятно, захотите выполнить итерацию по строкам ( DataFrame.iterrows() ) и удалить/удалить только одну строку, а не создавать новый фрейм данных без указанной строки:

 for index, row in last_modified_tracking_df.iterrows():
    if row["Source file"] not in last_modified_file_date_dict.keys():
        df.drop(index, inplace=True)
 

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

1. Спасибо. И не могли бы вы, пожалуйста, помочь мне с каким-либо лучшим подходом к проверке? В моем коде я переназначаю last_modified_tracking_df каждый раз, когда он удаляет строку.

2. @Gorib_coder Я добавил лучшее решение для проверки и удаления значений строк, если это необходимо (по крайней мере, то, что я думаю, должно быть лучше).