Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从DataFrame python中提取文件路径_Python_Pandas_Dataframe - Fatal编程技术网

从DataFrame python中提取文件路径

从DataFrame python中提取文件路径,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个Excel文件,其中包含列中文件夹的文件路径。一行中可能存储多个文件路径。 我可以像这样把excel文件读入熊猫 现在,我想做的是逐行遍历pandasDataFrame df并提取存储的目录,这样我就可以将它们用作其他函数的输入目录 如果我使用iloc访问数据帧中的行,我会得到一个类似于str的对象,而我想要的是让类型为list的每一行都有一个对象,这样我就可以遍历它 数据框中变量格式的示例 import pandas as pd path_1 = '[\'C:\\\\tmp_pati

我有一个Excel文件,其中包含列中文件夹的文件路径。一行中可能存储多个文件路径。 我可以像这样把excel文件读入熊猫

现在,我想做的是逐行遍历pandas
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!非常感谢。