python – 递归地将子文件夹中的文件读入列表,并将每个子文件夹的文件合并为每个子文件夹一个csv

我试图找出如何使用pandas递归导航文件夹子文件夹,将每个文件放在子文件夹中,并将其合并为每个子文件一个CSV文件.

所以我在类似于下面的结构中有多个文件.我想获取每个子文件夹并将其各自的CSV合并到每个子文件夹的一个文件中.请参阅第二个插图文件夹树.我之前没有使用过熊猫,但我认为我走在正确的轨道上,我正在努力找出每个子文件夹的逻辑.请参阅下面的我当前的代码.

*注意,每个CSV文件在列方面具有相同的结构.

在合并之前

Folder
      Sub-Folder1
               File1.csv
               File2.csv
               File3.csv
               File4.csv
      Sub-Folder2
               File1.csv
               File2.csv
      Sub-Folder3
               File1.csv
               File2.csv

合并后

Folder
      Sub-Folder1
               Final.csv
      Sub-Folder2
               Final.csv
      Sub-Folder3
               Final.csv

现行守则

import pandas as pd

working_dir = "/dir/"

for root, dirs, files in os.walk(working_dir):
    file_list = []
    for filename in files:
        file_list.append(root + "/" + filename) 
    df_list = [pd.read_table(file) for file in file_list]
    final_df = pd.concat(df_list) 
    final_df.to_csv(root + "/" + "Final.csv")

目前收到以下错误

ValueError:所有传递的对象都是None on big_df = pd.concat(df_list)

Anand S Kumar建议修正后的输出数据

csv带有一个不需要或不想要的新列的格式,数据集完全放入第二列.

    title1,title2,title3,title4
0   data1,data2,data3,data4
1   data1,data2,data3,data4
2   data1,data2,data3,data4
0   data1,data2,data3,data4
1   data1,data2,data3,data4
2   data1,data2,data3,data4
3   data1,data2,data3,data4

根据Anand S Kumar的建议添加数据集

title1,title2,title3,title4
13,[Group] data1,[Group] data2,data3
11,[Group] data1,[Group] data2,data3
2,[Group] data1,[Group] data2,data3
1,[Group] data1,[Group] data2,data3

解决方法:

问题很可能是在主目录 – Folder(或/ dir根据你的代码),你没有任何文件,所以file_list是空的,因此df_list也是空的.因此,当您将空列表传递给pd.concat()时,您将收到该错误.示例 –

In [5]: pd.concat([])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython> in <module>()
----> 1 pd.concat([])

/path/to/merge.py in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, copy)
    752                        keys=keys, levels=levels, names=names,
    753                        verify_integrity=verify_integrity,
--> 754                        copy=copy)
    755     return op.get_result()
    756

/path/to/merge.py in __init__(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy)
    797
    798         if len(objs) == 0:
--> 799             raise ValueError('All objects passed were None')
    800
    801         # consolidate data & figure out what our result ndim is going to be

ValueError: All objects passed were None

我建议您检查您正在阅读的文件是否真的是文件,并且当您将其传递给pd.concat()时,它们以.csv结尾并且df_list不为空.另外我建议您使用os.path.join()而不是连接字符串来创建路径.示例 –

import pandas as pd
import os.path
import os

working_dir = "/dir/"

for root, dirs, files in os.walk(working_dir):
    file_list = []
    for filename in files:
        if filename.endswith('.csv'):
            file_list.append(os.path.join(root, filename)) 
    df_list = [pd.read_table(file) for file in file_list]
    if df_list:
        final_df = pd.concat(df_list) 
        final_df.to_csv(os.path.join(root, "Final.csv"))

编辑:

正如你所说 –

Also the output is adding another column that looks to be an id column.

进入的新列很可能是DataFrames的索引.

在执行DataFrame.to_csv()时,如果您不希望将DataFrame的索引写入csv,则应将index关键字参数指定为False,以便不将索引写入csv.示例 –

final_df.to_csv(os.path.join(root, "Final.csv"), index=False)

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...