Python: заменить часть пути к файлу с помощью соответствия панд - PullRequest
0 голосов
/ 20 ноября 2018

Фрейм данных с 2 столбцами: old_path и new_path.Фрейм данных может содержать сотни строк.

Сценарий выполняет итерации по списку файлов.

Для каждого файла в списке проверьте, соответствует ли какая-либо часть его пути к папке значению в столбце old_path.Если есть совпадение, замените соответствующий файл old_path на соответствующее значение new_path.

Я добился этого с помощью for index, row in df.iterrows(): или for row in df.itertuples():, но я думаю, что должно быть более эффективнымспособ сделать это без необходимости использовать второй for цикл.

Любая помощь приветствуется.В приведенном ниже примере используется df.iterrows()

import pandas as pd
import os

df = pd.read_csv('path_lookup.csv')
# df:
#                                         old_path                      new_path
# 0               F:\Business\Budget & Forecasting  M:\Business\Finance\Forecast
# 1                    F:\Business\Treasury Shared  M:\Business\Finance\Treasury
# 2                                        C:\Temp                    C:\NewTemp

excel_link_analysis_list = [
    {'excel_filename': 'C:\\Temp\\12345\\Distribution Adjusted Claim.xlsx',
     'file_read': 'OK'},
    {'excel_filename': 'C:\\Temp\\SubFolder\\cost estimates.xlsx',
     'file_read': 'OK'}
]

for i in excel_link_analysis_list:
    for index, row in df.iterrows():
        if row['old_path'].lower() in i['excel_filename'].lower():
            dest_path_and_file = i['excel_filename'].lower().replace(row['old_path'].lower(), 
                                                                     row['new_path'].lower())
            print(dest_path_and_file)

отпечатков:

c: \ newtemp \ 12345 \ дистрибутив скорректированых заявок. Xlsx

c: \ newtemp \ subfolder\ оценки стоимости. xlsx

1 Ответ

0 голосов
/ 20 ноября 2018

Да, в pandas есть встроенные функции сравнения строк, см. Здесь: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.contains.html#pandas.Series.str.contains

Вот как вы можете использовать Series.str.contains, чтобы получить индекс соответствующего значения (то есть изстолбец old_path).Затем вы можете использовать этот индекс, чтобы вернуться назад и получить значение new_path

Правка: обновлено для обработки случая, когда new_path_matches имеет одно значение.

import pandas as pd

old_path = df['old_path']
new_path = df['new_path']

for filename in filenames:
    b = old_path.str.contains(filename)

    # Get the index of matches from `old_path` column
    indeces_of_matches = b[b].index.values    

    # use the index of matches to get the corresponding `new_path' values 
    new_path_matches = old_path.loc[indeces_of_matches]

    if (new_path_matches.value.shape[0]>0):
        print new_path_matches.values[0]   # print the new_path value
...