将多个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 文件导入数据帧

Pandas:连接多个 .csv 文件并返回聚合了同名列的 Dataframe

Python pandas - 将具有多个日期索引的csv合并到单个日期索引