嗨,我是python pandas的新手,也是我使用dataframe做代码的新手。因此,我从Internet获得了有关如何将一个文件夹中的两个或多个csv文件合并为一个普通csv文件的代码。但是我无法获得一行代码,我不知道该怎么做。谁能帮助我。
MyAttribute
所以在这里我尝试了一切,但无法获取df_from_each_file。所以任何人都可以在这方面帮助我 我希望输出像这样
答案 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+
用作分隔符或分隔符。
对于单线飞机,请将.assign
与file=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