从 OS 创建 Pandas 数据框
Creating Pandas Dataframe from OS
我正在尝试从 os.walk()
创建数据框。这是我的文件夹结构的示例。
Top Folder1
---File1
Top Folder2
---File2
---File3
---File4
我想像这样制作一个DataFrame:
Path File_Name
0 Folder1_Path File1
1 Folder2_Path File2
2 Folder2_Path File3
3 Folder2_Path File4
我可以获得文件夹的路径和文件名,但我找不到将它们组合成数据框的方法。我尝试将 concat
和 append
放入空的 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
如何在 DataFrame 的一列中获取 root
并在另一列中获取 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(files), files))
解释:
DataFrame class 可以接收多种类型的输入。一个容易理解的是 list
of tuple
。
每个元组的长度将是最终 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)]
将其扩展到结果列表只需将元组添加到结果列表即可。
我正在尝试从 os.walk()
创建数据框。这是我的文件夹结构的示例。
Top Folder1
---File1
Top Folder2
---File2
---File3
---File4
我想像这样制作一个DataFrame:
Path File_Name
0 Folder1_Path File1
1 Folder2_Path File2
2 Folder2_Path File3
3 Folder2_Path File4
我可以获得文件夹的路径和文件名,但我找不到将它们组合成数据框的方法。我尝试将 concat
和 append
放入空的 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
如何在 DataFrame 的一列中获取 root
并在另一列中获取 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(files), files))
解释:
DataFrame class 可以接收多种类型的输入。一个容易理解的是 list
of tuple
。
每个元组的长度将是最终 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)]
将其扩展到结果列表只需将元组添加到结果列表即可。