Python:使用Pandas Match替换部分文件路径

时间:2018-11-20 00:23:48

标签: python pandas loops for-loop filepath

具有2列的数据框:old_pathnew_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 \分布调整后的Claim.xlsx

     

c:\ newtemp \ subfolder \ cost估算.xlsx

1 个答案:

答案 0 :(得分:0)

是的,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