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