2017-03-07 54 views
1

我试图从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 

我能得到的文件夹的路径和文件名,但我不能找到一种方法,将它们组合成一个数据帧。我试过concatappend进入空的DataFrame无济于事,甚至尝试创建多个Series并将它们放入单个DataFrame中。

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 

我怎么会得到另一列一个数据帧的一个root列和files

回答

2

我会做这样的事情:

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') 

编辑:其实我觉得你不需要在ziplist()。两者应该工作res.extend(zip([root]*len(files), files))

说明:

数据帧类可以接收多个类型的输入。容易理解的是tuplelist

每个元组的长度将是您最终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)] 

它延伸到结果列表的长度只需添加元组的结果列表。

+0

我有一种感觉,我将不得不做一些乘法哈哈!谢谢你一百万。如果你有时间,我总是喜欢回答回答我问题的人的想法。可以解释一下解决方案或者你是如何到达的?我会“逆向工程”它最好我可以 – MattR

+1

更新了答案 –

+0

美丽的解释! – MattR