Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并csv文件时添加文件名作为标题_Python_Python 3.x_Pandas_Csv - Fatal编程技术网

Python 合并csv文件时添加文件名作为标题

Python 合并csv文件时添加文件名作为标题,python,python-3.x,pandas,csv,Python,Python 3.x,Pandas,Csv,希望将所有csv合并到一个文件夹中。这正是我们想要的 import os import glob import pandas as pd extension = 'csv' all_filenames = [i for i in glob.glob('*.{}'.format(extension))] #combine all files in the list combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames],

希望将所有csv合并到一个文件夹中。这正是我们想要的

import os
import glob
import pandas as pd

extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]

#combine all files in the list
combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames], axis = 1)
#export to csv
combined_csv.to_csv( "combined.matrix", index=False)
但是,我想添加没有扩展名的文件名作为标题

File1.csv

A,B
1,2
3,4
文件2.csv

A,B
5,6
组合矩阵

File1,File1,File2,File2
A,B,A,B
1,2,5,6
3,4,,
请尝试以下代码:

import pandas as pd

all_filenames = ['File1.csv','File2.csv']
headers = []
for i in all_filenames:
    headers.append(i.replace('.csv', ''))

combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames], keys=headers, axis = 1)
创建了文件名不包括扩展名的标题列表。将列表传递给pd.concat函数中的keys参数。

导入操作系统
作为pd进口熊猫
父目录='您的父目录\u路径'
ext='csv'
组合_csv=pd.DataFrame()
对于os.walk(parent_dir)中的root、dir和文件:
对于文件中的f:
path=os.path.join(根,f)
文件名,扩展名=os.path.splitext(f)
如果扩展==f'{ext}':
新建_df=pd.read_csv(路径)
cols=新的列
new_cols=[]
对于cols中的c:
new_cols.append(f'{filename}{c}')
新列=新列
合并的csv=pd.concat([合并的csv,新的df],轴=1)
组合到组合(“组合矩阵”,索引=False)

基本思想是,在将文件导出到csv以供进一步处理时,您可以将文件名包含在
数据框
本身的某个位置(在本例中,我将其包含在列名中,您可能也可以将其包含在一行中)

all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
# This takes the value ["file1.csv", "file2.csv"]

#combine all files in the list
combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames], axis = 1)
# This looks like
# A B A B
# 1 2 5 6
# 3 4 nan nan
由于列名是固定的(A和B),而且您对文件名更感兴趣,因此可以使用

combined_csv.columns = sorted(all_filenames * len(combined_csv.columns) / len(all_filenames))
# This evaluates to sorted(["file1.csv", "file2.csv"] * 4 / 2) which is equal to ["file1.csv", "file1.csv", "file2.csv", "file2.csv"]
现在,您的数据帧看起来像-它指示哪个列来自哪个文件

# file1.csv file1.csv file2.csv file2.csv
# 1 2 5 6
# 3 4 nan nan

您可以在导出之前将其导出到
combined.matrix.csv

那么
combined\u csv.columns=all\u filename
呢?对于Python来说是新手,愿意学习;)。。。你的确切意思是什么?添加了一个带有解释的答案new_cols=new_cols.append(f'{filename}{c}')导致'NoneType'对象没有属性'append'。将其更改为新的_cols.append(f'{filename}{c}'),就像这里建议的那样,但是combined.csv有File1A、File1B、File2A、File2B作为headerMy抱歉,是的,
list.append()
方法应该不返回任何值,这将导致问题。我更正了上面的答案。非常感谢。