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]
周围的括号有什么作用?如果没有它们,它将使用
根目录的每个部分,而不是完整的
根目录。有关于这方面的文件吗?找不到。根是一个字符串,我只是把它放在一个列表中。不能将字符串相乘,但可以将列表相乘