具有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 \分布调整后的Claim.xlsx
c:\ newtemp \ subfolder \ cost估算.xlsx
答案 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