我正在尝试找出如何使用pandas
递归方式浏览文件夹子文件夹,将子文件夹中的每个文件合并到每个子文件夹中的一个CSV文件中。
所以我有多个文件,结构类似于以下内容。我想获取每个子文件夹并将其各自的CSV合并到每个子文件夹一个文件中。请参考第二个图示的文件夹树。我pandas
以前没有使用过,但是我认为我走在正确的轨道上,我正在努力为每个子文件夹制定逻辑。请参考下面我的当前代码。
*请注意,每个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: All objects passed were None
在线 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
我建议你应该检查你正在阅读的文件确实是文件和他们最终用.csv
,而且df_list
不为空,当你将它传递到pd.concat()
。另外,我建议您使用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"))
编辑:
正如你所说 -
此外,输出还会添加另一个看起来像id列的列。
出现的新列很可能是DataFrames的索引。
在执行此操作时DataFrame.to_csv()
,如果您不想将DataFrame的索引写入csv,则应将index
关键字参数指定为,False
以便将索引不写入csv。范例-
final_df.to_csv(os.path.join(root, "Final.csv"), index=False)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句