从DataFrame python中提取文件路径
我有一个Excel文件,其中包含列中文件夹的文件路径。一行中可能存储多个文件路径。 我可以像这样把excel文件读入熊猫 现在,我想做的是逐行遍历pandas从DataFrame python中提取文件路径,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个Excel文件,其中包含列中文件夹的文件路径。一行中可能存储多个文件路径。 我可以像这样把excel文件读入熊猫 现在,我想做的是逐行遍历pandasDataFrame df并提取存储的目录,这样我就可以将它们用作其他函数的输入目录 如果我使用iloc访问数据帧中的行,我会得到一个类似于str的对象,而我想要的是让类型为list的每一行都有一个对象,这样我就可以遍历它 数据框中变量格式的示例 import pandas as pd path_1 = '[\'C:\\\\tmp_pati
DataFrame df
并提取存储的目录,这样我就可以将它们用作其他函数的输入目录
如果我使用iloc访问数据帧中的行,我会得到一个类似于str
的对象,而我想要的是让类型为list
的每一行都有一个对象,这样我就可以遍历它
数据框中变量格式的示例
import pandas as pd
path_1 = '[\'C:\\\\tmp_patients\\\\Pat_MAV_BE_B01_\']'
path_2 = '[\'C:\\\\tmp_patients\\\\Pat_MAV_B16\', \'C:\\\\tmp_patients\\\\Pat_MAV_BE_B16_2017-06-30_08-49-28\']'
d = {'col1': [path_1, path_2]}
df = pd.DataFrame(data=d)
#or read directly excel
# df= pd.read_excel(filepath_to_excel)
for idx in range(len(df)):
paths = df['col1'].iloc[idx]
for a_single_path in paths:
print(a_single_path)
# todo: process all the files found at the location "a single path" with os.walk
使用pd.read\u excel()读取文件后数据的外观
您的示例输入具有类似于数组的字符串。我认为read\u excel
不会这样做,因此您不需要下面的.apply(literal\u eval)
调用
假设您使用的是pandas 0.25或更高版本,因此可以使用explode
:
from ast import literal_eval
path_1 = "['C:\\\\develop\\\\python-util-script\\\\Pat_MAV_B01']"
path_2 = "['C:\\\\develop\\\\python-util-script\\\\Pat_MAV_B16', 'C:\\\\develop\\\\python-util-script\\\\Pat_MAV_BE_B16_2017-06-30_08-49-28']"
d = {'col1': [path_1, path_2]}
df = pd.DataFrame(data=d)
df['col1'].apply(literal_eval).explode()
输出:
0 C:\develop\python-util-script\Pat_MAV_B01
1 C:\develop\python-util-script\Pat_MAV_B16
1 C:\develop\python-util-script\Pat_MAV_BE_B16_2...
Name: col1, dtype: object
如果需要单个目录的行,请执行以下操作:
数据:
- 注意:使用的列名是
file\u path\u list
,但问题屏幕截图中的列名是col1
从pathlib导入路径
从ast导入文字值
df=pd.read\u excel('test.xlsx')
将行从str
转换为list
和explode
每个list
转换为单独的行:
df.file\u path\u lists=df.file\u path\u lists.apply(literal\u eval)
df2=pd.DataFrame(df.explode('file\u path\u list'))
df2.dropna(就地=真)
打印(df2.file\u path\u列表[0])
>>>'C:\\tmp\U患者\\Pat\u MAV\u BE\u B01\uu'
- 注意,路径仍然是一个
str
转换为pathlib
对象:
- 是标准库的一部分,应使用,而不是
os
李>
df2.file\u path\u list=df2.file\u path\u list.apply(path)
打印(df2.file\u path\u列表[0])
>>>WindowsPath('C:/tmp\u患者/Pat\u MAV\u BE\u B01\uu')
- 现在每个都是一个
pathlib
对象
访问每个目录:
df2.file\u path\u列表中的目录的:
打印(目录)
打印(类型(dir))
>>>C:\tmp\U患者\Pat\u MAV\u BE\u B01_
C:\tmp\U患者\Pat\U MAV\U B16
C:\tmp_患者\Pat_MAV_BE_B16_2017-06-30_08-49-28
打印在患者目录中找到的文件列表:
df2.file\u path\u列表中的目录的:
patient_files=list(dir.glob('*.'))#如果有子目录,则使用.rglob
打印(患者档案)
如果您想要列表的行,而不是每个目录的一行:
- 跳过
。分解
df=pd.read\u excel('test.xlsx')
df.file\u path\u lists=df.file\u path\u lists.apply(literal\u eval)
打印(类型(df.file\u path\u list[0]))
>>>名单
对于df.file_path_列表中的行:#迭代该行
对于行中的x:#迭代行中的列表
打印(x)
>>>C:\tmp\U患者\Pat\u MAV\u BE\u B01_
C:\tmp\U患者\Pat\U MAV\U B16
C:\tmp_患者\Pat_MAV_BE_B16_2017-06-30_08-49-28
read\u excel
正是这样做的,因为我正在用它阅读我的df
。我运行了您的代码,但没有任何更改:/。还修改了问题中的输入路径,最初我没有完全按照pd.read\u excel()
导入的方式复制它们。运行代码时出现的错误:ValueError:(“格式错误的节点或字符串:0['C:\\\\tmp\u患者\\\\Pat u MAV\u BE\u B01\u']\ n1 NaN\n名称:0,数据类型:object”,“在索引0处发生”)
更新了屏幕截图,显示了我使用pd.read\u excel()将数据加载到df后数据的外观。为什么每个C:\的左侧都有一个“\”?您是从csv
还是xlsx
文件中读取此内容的?其中每一个都将以字符串形式读取,并且df.explode()
不会在字符串上工作。@Trenton\u当我使用df['col1']访问df
的行时,会出现异常。iloc[idx]`a“\”被添加到左侧。我不知道确切的原因,因为在原始的df
中不存在。@Trenton\u M使用数据的屏幕截图进行了更新。在df
的第14行,您可以注意到我有两个单独的文件路径。@Trenton\u M.xlsx
@Trenton\u M!非常感谢。