合并或合并具有不同列数的多个CSV文件,并分配文件名列

时间:2020-08-04 07:49:05

标签: python pandas csv

嗨,我是python pandas的新手,也是我使用dataframe做代码的新手。因此,我从Internet获得了有关如何将一个文件夹中的两个或多个csv文件合并为一个普通csv文件的代码。但是我无法获得一行代码,我不知道该怎么做。谁能帮助我。

MyAttribute

所以在这里我尝试了一切,但无法获取df_from_each_file。所以任何人都可以在这方面帮助我 我希望输出像这样

So here is how my output should look like

1 个答案:

答案 0 :(得分:1)

编辑#2:实际数据与示例数据不同,需要通过传递axis=1来水平而不是垂直地压缩。这将创建重复的列,因此需要将数据帧与.T进行转置,以便将这些重复的列作为带有drop_duplicates()的重复行来删除。最后,需要再次用.T换位。另外,在读取文件时,我们必须排除听众,因为其中两个文件具有完全相同的值,因此它们会被无意中删除。这就是为什么我们必须将列标题读为值,然后将它们提升回末尾并使用.iloc删除第一行。

pd.concat([pd.read_csv(f, header=None) for f in all_files], axis=1).T.drop_duplicates().T.to_csv('merged.csv', index=False)
df.columns = df.iloc[0]
df = df.iloc[1:]
df.to_csv('merged.csv', index=False)

编辑#1:正如在LinkedIn上讨论的那样,您的所有数据都位于一列中,因此要以多列的形式读取它,您需要使用sep='\s+',因为存在多个空格来分隔数据,因此您可以将\s+用作分隔符或分隔符。

对于单线飞机,请将.assignfile=os.path.basename(f)一起使用

pd.concat([pd.read_csv(f, sep='\s+').assign(file=os.path.basename(f)) for f in all_files]).to_csv('merged.csv', index=False)

根据您的评论,我用不同的列测试了此确切的代码,并获得了成功的结果:

import pandas as pd
import glob, os
path = 'Desktop'
all_files = glob.glob(os.path.join(path, "Book*.csv"))
pd.concat([pd.read_csv(f, sep='\s+').assign(file=os.path.basename(f)) for f in all_files]).to_csv('merged.csv', index=False)

如果excel文件已经被分成几列,则删除sep='\s+'并使用以下代码:

pd.concat([pd.read_csv(f).assign(file=os.path.basename(f)) for f in all_files]).to_csv('merged.csv', index=False)

Book1.csv

col1    col2    col3    col4    col5
1       2       3       4       5

Book2.csv

col1    col2    col3    col4
2       3       4       5

merged.csv

col1    col2    col3    col4    col5    file
1       2       3       4       5       Book1.csv
2       3       4       5               Book2.csv