Python 从操作系统创建数据帧
我正在尝试从Python 从操作系统创建数据帧,python,pandas,dataframe,python-os,Python,Pandas,Dataframe,Python Os,我正在尝试从os.walk()创建数据帧。下面是我的文件夹结构的示例 Top Folder1 ---File1 Top Folder2 ---File2 ---File3 ---File4 我想制作这样一个数据帧: Path File_Name 0 Folder1_Path File1 1 Folder2_Path File2 2 Folder2_Path File3 3 Folder2_Path File4 我可以得到文件夹的路径和文
os.walk()
创建数据帧。下面是我的文件夹结构的示例
Top Folder1
---File1
Top Folder2
---File2
---File3
---File4
我想制作这样一个数据帧:
Path File_Name
0 Folder1_Path File1
1 Folder2_Path File2
2 Folder2_Path File3
3 Folder2_Path File4
我可以得到文件夹的路径和文件名,但我找不到将它们合并到数据框中的方法。我曾尝试将concat
和append
添加到空数据帧中,但均无效,甚至尝试创建多个系列
,并将它们放入单个数据帧中
import pandas as pd
import os
import os.path
for root,dirs,files in os.walk('Y:\\', topdown=True):
if len(files) > 0:
print(root) #Gets the Folder Path
print("---", files) #Creates a List of the files
如何在数据帧的一列中获取
根目录
,在另一列中获取文件
import os
import pandas as pd
res = []
for root, dirs, files in os.walk('Y:\\', topdown=True):
if len(files) > 0:
res.extend(list(zip([root]*len(files), files)))
df = pd.DataFrame(res, columns=['Path', 'File_Name']).set_index('Path')
编辑:实际上,我认为您不需要zip中的list()
。两者都应该工作res.extend(zip([root]*len(文件),文件))
说明:
DataFrame类可以接收多种类型的输入。易于理解的是元组的列表
每个元组的长度将是最终数据帧的列数。此外,当涉及循环时,追加/扩展列表是非常高效的
例如:
tuple1 = (1, 2)
tuple2 = (110, 230)
all_list = [tuple1, tuple2]
pd.DataFrame(all_list)
Out[4]:
0 1
0 1 2
1 110 230
您可以任意附加到该格式:
for i in range(100):
all_list.append((i, i))
pd.DataFrame(all_list)
Out[19]:
0 1
0 1 2
1 110 230
2 0 0
3 1 1
4 2 2
5 3 3
...
因为您知道要传递长度为2的元组,所以可以传递列名称:
pd.DataFrame(all_list, columns=['path', 'file']).head()
Out[21]:
path file
0 1 2
1 110 230
2 0 0
3 1 1
4 2 2
在您给我们的示例中,root的长度始终为1,文件的大小可以是任意大小。使用zip,我为根中的每个文件创建长度为2(根,文件)的元组。由于您不知道每个根目录下有多少个文件,因此可以使用[root]*len(files)
调整根目录的长度以匹配文件的长度
list(zip(["a"]*len(tuple1), tuple1))
Out[6]:
[('a', 1), ('a', 2)]
将其扩展到结果列表,只需将元组添加到结果列表。我有一种感觉,我必须做一些乘法运算哈哈!非常感谢你。如果你有时间,我总是喜欢躲在回答我问题的人背后。你能解释一下解决方案吗?或者你是如何找到的?我会“逆向工程”这是我能做的最好的解释!抱歉,重复评论,无法编辑上一条。[root]
周围的括号有什么作用?如果没有它们,它将使用根目录的每个部分,而不是完整的根目录。有关于这方面的文件吗?找不到。根是一个字符串,我只是把它放在一个列表中。不能将字符串相乘,但可以将列表相乘