簡體   English   中英

從pandas DataFrame python中提取文件路徑

[英]Extract filepaths from pandas DataFrame python

我有一個Excel文件,其中包含列中文件夾的文件路徑。 可能有多個文件路徑存儲在一行中。 我可以將excel文件讀成像這樣的pandas。

現在我要做的是DataFrame df迭代我的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_excel()讀取文件后數據的外觀 DF

如果您想要各個目錄的行:

數據:

在此輸入圖像描述

  • 請注意,正在使用的列名是file_path_lists ,但問題屏幕截圖中列的名稱是col1
from pathlib import Path
from ast import literal_eval

df = pd.read_excel('test.xlsx')

在此輸入圖像描述

從轉換行strlistexplode的每個list到一個單獨的一行:

df.file_path_lists = df.file_path_lists.apply(literal_eval)
df2 = pd.DataFrame(df.explode('file_path_lists'))
df2.dropna(inplace=True)

在此輸入圖像描述

print(df2.file_path_lists[0])
>>> 'C:\\tmp_patients\\Pat_MAV_BE_B01_'
  • 注意路徑仍然是str

轉換為pathlib對象:

df2.file_path_lists = df2.file_path_lists.apply(Path)
print(df2.file_path_lists[0])
>>> WindowsPath('C:/tmp_patients/Pat_MAV_BE_B01_')
  • 現在每個都是一個pathlib對象。

訪問每個目錄:

for dir in df2.file_path_lists:
    print(dir)
    print(type(dir))

>>> C:\tmp_patients\Pat_MAV_BE_B01_
    <class 'pathlib.WindowsPath'>

    C:\tmp_patients\Pat_MAV_B16
    <class 'pathlib.WindowsPath'>

    C:\tmp_patients\Pat_MAV_BE_B16_2017-06-30_08-49-28
    <class 'pathlib.WindowsPath'>

打印患者目錄中的文件列表:

for dir in df2.file_path_lists:
    patient_files = list(dir.glob('*.*'))  # use .rglob if there are subdirs
    print(patient_files)

如果您想要lists行而不是每個目錄的行:

  • 跳過.explode
df = pd.read_excel('test.xlsx')
df.file_path_lists = df.file_path_lists.apply(literal_eval)

print(type(df.file_path_lists[0]))
>>> list

for row in df.file_path_lists:  # iterate the row
    for x in row:  # iterate the list inside the row
        print(x)

>>> C:\tmp_patients\Pat_MAV_BE_B01_
    C:\tmp_patients\Pat_MAV_B16
    C:\tmp_patients\Pat_MAV_BE_B16_2017-06-30_08-49-28

您的示例輸入具有看起來像數組的字符串。 我認為read_excel不會這樣做所以你不需要下面的.apply(literal_eval)調用。

假設您使用的是0.25或更高版本的pandas,那么您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM