将多个csv文件导入pandas并合并到一个DataFrame中
Posted
技术标签:
【中文标题】将多个csv文件导入pandas并合并到一个DataFrame中【英文标题】:Importing multiple csv files into pandas and merge them into one DataFrame 【发布时间】:2020-02-05 00:50:53 【问题描述】:我有多个 csv 文件(每个文件包含 N 行 (例如,1000 行) 和 43 列)。
我想从一个文件夹中读取几个 csv 文件到 pandas 中,并将它们合并到一个 DataFrame 中。
我还没弄明白。
问题在于, DataFrame 的最终输出(即frame = pd.concat(li, axis=0, ignore_index=True)
)将所有列(即43 列)合并为一列 (见附图)
Screenshot of the code
所选行和列的示例(文件一)
Client_ID Client_Name Pointer_of_Bins Date Weight
C0000001 POLYGONE TI006093 12/03/2019 0.5
C0000001 POLYGONE TI006093 12/03/2019 0.6
C0000001 POLYGONE TI006093 12/03/2019 1.4
C0000001 POLYGONE TI006897 14/03/2019 2.9
所选行和列的示例(文件二) Client_ID Client_Name Pointer_of_Bins 日期 权重 C0000001 多边形 TI006093 22/04/2019 1.5 C0000001 阿尔迪 TI006098 22/04/2019 0.7 C0000001 阿尔迪 TI006098 22/04/2019 2.4 C0000001 阿尔迪 TI006898 24/04/2019 1.9
预期的输出将如下所示(合并可能包含数千行和数列的多个文件,因为附加数据只是一个示例,而实际的 csv 文件可能包含数千行和超过 45 列每个文件)
Client_ID Client_Name Pointer_of_Bins Date Weight
C0000001 POLYGONE TI006093 12/03/2019 0.5
C0000001 POLYGONE TI006093 12/03/2019 0.6
C0000001 POLYGONE TI006093 12/03/2019 1.4
C0000001 POLYGONE TI006897 14/03/2019 2.9
C0000001 POLYGONE TI006093 22/04/2019 1.5
C0000001 ALDI TI006098 22/04/2019 0.7
C0000001 ALDI TI006098 22/04/2019 2.4
C0000001 ALDI TI006898 24/04/2019 1.9
TO Download the two CSV files, click here (dummy data
这是我到目前为止所做的:
import pandas as pd
import glob
path = r'C:\Users\alnaffakh\Desktop\doc\Data\data2\Test'
all_files = glob.glob(path + "/*.csv")
li = []
for filename in all_files:
df = pd.read_csv(filename, sep='delimiter', index_col=None, header=0)
# df = pd.read_csv(filename, sep='\t', index_col=None, header=0)
li.append(df)
frame = pd.concat(li, axis=0, ignore_index=True)
【问题讨论】:
摆脱sep='delimeter'
。现在的代码,将 all 数据帧作为一列读取。
@QuangHoang,感谢您的回复,但如果我删除它,我会收到此错误(UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 8: invalid continuation byte)
请分享一些虚拟数据。我支持@QuangHoang 提到的内容:您需要摆脱sep='delimiter'
或使用文件中已使用的实际分隔符。这就是为什么我建议您分享一些虚拟数据(可能是 4 行只有 5 列),以便我们可以对此进行测试。
你可以考虑使用dask。
【参考方案1】:
解决方案
您可以使用pandas.concat
递归连接.csv
文件内容。
事实上,我看到您使用了它,并且 您的 concat
应用程序对我来说似乎很好。尝试调查您阅读的各个数据帧。如果您没有提及正确的分隔符,您的列可以合并为单个列的唯一方法。
import pandas as pd
dfs = list()
for filename in filesnames:
df = pd.read_csv(filename)
dfs.append(df)
frame = pd.concat(dfs, axis=0, ignore_index=True)
df.head()
虚拟数据示例
由于可用的虚拟数据还不是文本格式,所以我只使用我制作的一些虚拟数据。
import pandas as pd
from io import StringIO # needed for string to dataframe conversion
file1 = """
Col1 Col2 Col3 Col4 Col5
1 ABCDE AE10 CD11 BC101F
2 GHJKL GL20 JK22 HJ202M
3 MNPKU MU30 PK33 NP303V
4 OPGHD OD40 GH44 PG404E
5 BHZKL BL50 ZK55 HZ505M
"""
file2 = """
Col1 Col2 Col3 Col4 Col5
1 AZYDE AE10 CD11 BC100F
2 GUFKL GL24 JK22 HJ207M
3 MHPRU MU77 PK39 NP309V
4 OPGBB OE90 GH41 PG405N
5 BHTGK BL70 ZK53 HZ508Z
"""
将数据加载为单独的数据帧,然后将它们连接起来。
df1 = pd.read_csv(StringIO(file1), sep='\t')
df2 = pd.read_csv(StringIO(file2), sep='\t')
print(pd.concat([df1, df2], ignore_index=True))
输出:
Col1 Col2 Col3 Col4 Col5
0 1 ABCDE AE10 CD11 BC101F
1 2 GHJKL GL20 JK22 HJ202M
2 3 MNPKU MU30 PK33 NP303V
3 4 OPGHD OD40 GH44 PG404E
4 5 BHZKL BL50 ZK55 HZ505M
5 1 AZYDE AE10 CD11 BC100F
6 2 GUFKL GL24 JK22 HJ207M
7 3 MHPRU MU77 PK39 NP309V
8 4 OPGBB OE90 GH41 PG405N
9 5 BHTGK BL70 ZK53 HZ508Z
【讨论】:
@Wisamhasan 感谢您提供数据。但是,请将两个 csv 文件中的每一个的前 5 列和 4 行粘贴到您的问题陈述中,作为 csv 文件中的示例数据。然后还提供您所期望的。您的数据需要最少且可重复。最好不要共享数据文件。 @Wisamhasan 感谢您提供的行和列。但是,我要求将数据作为文本粘贴到您的问题描述中。这使您的问题很容易复制。请制作一个代码块并将文件 1 和文件 2 中的数据列(子集)粘贴到该代码块中。 谢谢,但附加的代码不能解决问题。 代码是为了回答你提到的问题。我留下了另一条关于检查实际使用的分隔符的评论。看起来您的问题存在于数据中。请检查使用了什么分隔符,然后使用它。 @Meet 是的,您可以将多索引与文件源标识符一起使用。但我建议不要将文件名用作多索引的一部分。文件名可能很长,当它们被命名时,您可能无法控制它们的命名逻辑。相反,如果您只想跟踪数据的来源,我建议您添加另一列“来源”并在那里填写文件名。您始终可以通过这种方式有条件地提取特定于文件的数据。但请考虑尽可能长时间保持索引单数,除非绝对必要。以上是关于将多个csv文件导入pandas并合并到一个DataFrame中的主要内容,如果未能解决你的问题,请参考以下文章
将多个csv文件导入pandas并拼接成一个DataFrame
如何使用 Pandas 将多个 csv 文件中的单个数据列合并为一个?
如何使用 Python Pandas 合并多个 CSV 文件
Pandas:使用循环和分层索引将多个 csv 文件导入数据帧