2 回答
TA贡献1884条经验 获得超4个赞
如果您想要单个目录的行:
数据:
注意正在使用的列名是file_path_lists,但问题截图中的列名是col1
from pathlib import Path
from ast import literal_eval
df = pd.read_excel('test.xlsx')
将行 from和each转换str为单独的行:listexplodelist
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对象:
pathlib标准库的一部分,应该使用而不是os. Python 3 的 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
TA贡献1803条经验 获得超6个赞
您的示例输入具有看起来像数组的字符串。我认为read_excel不会那样做,所以你不需要.apply(literal_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
添加回答
举报