如何将多个 CSV 文件连接到一个数据框中?

假设您正在开发您梦想的项目,并且有大量彼此相关的数据,但分布在多个 CSV 文件中。您可能希望同时分析和操作所有这些数据,并希望一切顺利。

解决此问题的一种方法是导入您需要或想要使用的所有 CSV 文件,并将这些文件连接到单个数据框中。

在继续连接 CSV 文件之前,让我们了解一下 Pandas 数据框、CSV 文件格式以及用于连接文件的方法。

什么是数据框?

在讨论 Pandas 库时,必须要谈论它最常用的数据结构之一——数据框架。

请参阅本文以了解有关 Pandas 库的数据结构的更多信息。

数据框是一个二维表,以行和列存储数据。

它类似于线性代数中的矩阵,但比矩阵能做更多的事情。它可以存储不同的数据类型,例如数字、分类、字符、浮点等等,这使得处理多种数据类型的数据变得容易。

让我们看一个数据框的例子。

1
2
3
4
5
6
7
8
9
#example of a data frame
import pandas as pd
electronics_data = {
    'Date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04'],
    'Salesperson': ['Alice', 'Bob', 'Charlie', 'Alice'],
    'Product': ['Buds', 'Speaker', 'Smartphone', 'Mac'],
    'Price': [2.99, 7.50,9.99,12.25]}
df = pd.DataFrame(electronics_data)
print(df)

Pandas 库用于处理数据和数据存储。第一行,我们可以看到它被导入为 pd。

接下来,我们创建一个以键值对格式存储的值字典。这本词典向我们展示了一家电子产品商店的销售数据。它向我们显示了客户的姓名、购买日期以及已购买的商品。

现在,这是一本字典。我们需要一个数据框。幸运的是,我们有 Pandas 库,它具有充足的内置函数,支持将任何数据存储格式转换为数据框架,反之亦然。其中一种方法是pd.DataFrame

我们可以将任何数据格式作为参数传递给此方法,然后繁荣!我们有一个数据框。

数据框如下所示。

数据框

什么是 CSV 文件?

CSV 代表逗号分隔值。CSV 具有自描述性,将数据存储为行,并用逗号分隔。

CSV 文件格式以简单的格式存储数据。这样的存储可以支持不同平台甚至语言之间的数据交换。

让我们看一个 CSV 文件的示例以及如何使用 Pandas 库导入 CSV 文件。

查看 IPL 球队数据集。下载后,它看起来像这样。

CSV 示例

它包含有关被考虑选入球队的球员的所有必要信息。如果您注意到,所有条目都用逗号分隔。

您想知道如何导入这个数据集吗?我们找到你了!

下面给出了导入 CSV 数据集的代码。

1
2
3
4
#CSV example
import pandas as pd
df=pd.read_csv('/content/drive/MyDrive/Player.csv')
df

首先,我们将必要的库导入到我们的环境中以供使用。

接下来,我们创建一个新变量来使用pd.read_csv. 我们希望读取的文件应该从源下载,并且在我们工作的同一环境中。文件的路径作为参数传递给函数read_csv

Pandas read_csv():将 CSV 文件读入 DataFrame

输出是一个数据帧。

导入 CSV 文件

由于这里使用的是Google Colaboratory,所以文件上传到Google Drive,并挂载在Colab中,方便访问。我们使用的文件是 Player.csv,其路径被复制并作为参数传递给读取函数。

从数据框中可以看到,最后一列Unnamed:7完全填充了 NaN 值。当您看到此类列时,您有两种方法。用零或任何策略(例如平均值、中位数)填充 NaN 值,或者直接删除该列。

如果您观察数据框的属性,您可能会发现该列完全无用,因为它与其他标签无关。

在这种情况下,您可以删除该列。

这是清理后的代码和输出。

df.drop('Unnamed: 7',axis=1)

drop 函数从数据框中删除不必要的行和列。如果删除一列,则轴等于“1”。如果删除一行,则轴等于“0”。

清理后的数据框如下所示。

df.drop

现在我们已经介绍了数据帧和 CSV 的基础知识,让我们看看用于连接数据帧的重要函数 – pd.concat


探索 pd 的语法。连接

该方法用于沿指定轴连接 Pandas 对象。

语法如下。

pandas.concat(objs, *, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)

语法的重要参数是

objs: 要连接的 Pandas 对象的序列
axis: 该参数指定应进行连接的轴。如果使用对象的索引来连接,则轴应为 0。如果要使用对象的列来连接,则轴应为 0。连接,此参数应等于 1。ignore_index

如果此参数设置为 True,则生成的数据框将具有从 0 开始的未命名索引列。
如果设置为,生成的数据框将不会有额外的索引列错误的。

其他参数是:
join:它告诉要包含哪些索引。
如果连接是“外部”,则使用索引的并集。
如果连接是“内部”,则使用索引的交集。

keys:用于构建层次索引。
当我们尝试将对象与表示不同条目的列或标签连接起来时,此参数可能会有所帮助。
sort:该参数指定数据框是否应该排序。默认情况下,它是 False。
copy:默认情况下,该参数设置为 True,这意味着为数据创建一个新对象。

返回类型: object,obj的类型。如果 axis=0,则创建一个系列。如果 axis=1,则创建数据框。

pd.concat让我们看看以下示例中的用法。


导入多个 CSV 文件,为每个文件创建单独的数据框,然后将它们连接起来。

read_csv在此示例中,让我们获取两个相关的 CSV 文件,分别使用它们导入,并连接它们各自的数据框。

我们将在本示例中处理的数据集与英国 (UK) 的 COVID-19 数据相关。

我们有三个彼此相关的数据集。让我们来看看他们每个人都为我们准备了什么。

让我们看看如何为每个数据集导入和创建数据框。

England_Regions_COVID_Dataset.csv

England_Regions_COVID_Dataset.csv
它具有以下关联标签。
日期– 调查发布的日期。
areaName – 记录案例的区域。
newDeaths28DaysByDeathDate – COVID-19 检测呈阳性后 28 天内新增死亡病例。
cumDeaths28DaysByDeathDate – COVID-19 检测呈阳性后 28 天内的累计死亡人数。

1
2
3
4
5
#reading multiple csv files
#csv1
import pandas as pd
df1=pd.read_csv('/content/drive/MyDrive/England_Regions_COVID_Dataset.csv')
df1

第一个数据集被读入名为 df1 的变量中。

下面给出了该数据集对应的数据框。

数据框1.1

UK_National_Total_COVID_Dataset.csv

该数据集中的属性解释如下。

日期– 调查发布的日期。
areaName – 记录案例的区域。
newCasesByPublishDate – 在发布日期或之前注册的新案例数。
cumCasesByPublishDate – 在发布日期或之前注册的累积案例。
新入院人数 – 入院人数。
医院病例– 医院中已经存在。
covidOccupiedMVBeds – 医院占用的床位数量。
cumPeopleVacculatedFirstDoseByPublishDate – 在发布日期或之前接种第一针疫苗的累计人数。
暨人疫苗接种第二剂按发布日期– 在发布日期或之前接种第二针疫苗的累计人数。

1
2
3
#csv2
df2=pd.read_csv('/content/drive/MyDrive/UK_National_Total_COVID_Dataset.csv')
df2

第二个数据集被读入名为 df2 的新变量中,然后打印。

数据框1.2

NEW_Official_Population_Data_ONS_mid-2019.csv

该数据集具有以下属性。
areaCode –该地区的邮政编码。
areaName – 区域的名称。
areaType – 区域类型(国家、地方政府区)。
面积– 该区域的面积(以平方公里为单位)。
人口——该地区的人口。

1
2
3
#csv3
df3=pd.read_csv('/content/drive/MyDrive/NEW_Official_Population_Data_ONS_mid-2019.csv')
df3

上述CSV文件的数据框如图所示。

数据框1.3

连接三个数据框

为了连接数据帧,我们使用该pd.concat方法。

代码如下。

1
2
3
#concatenated data frame
df4=pd.concat([df1,df2,df3], axis=0, ignore_index=True)
df4

这三个数据帧将一个列表传递给该pd.concat方法。

连接的数据框如下所示。

多个 CSV 文件的串联 1

某些列的开头有很多 NaN 值,因为第一个数据框可能没有这些属性。


使用Map函数一次连接多个数据框

遵循前面的例子会消耗我们的时间。如果我们有一个函数可以一次读取所有 CSV 文件并返回连接的数据框怎么办?

称为 map 的函数用于对一系列对象应用特定函数。

映射函数的语法如下。

map(function,iterable....)

让我们看看这个函数的用法。

但在此之前,让我们了解一下此示例中使用的数据集。

我们将看到的两个数据集是垃圾邮件检测数据集。

电子邮件.csv

该数据集大约有 3000 列。该数据集的第一列是电子邮件编号,最后一列是测试标签(spam-1 而不是 spam-0)。其余列是电子邮件中最常出现的单词的标签。

其中一些单词包括 the、to、and、for、of、a、you、in、on、is、this、I、be、that、will

spambase_csv.csv

该数据集包含电子邮件中一些常见单词的频率以及用于预测电子邮件是否为垃圾邮件的标签。(1 表示垃圾邮件,0 表示非垃圾邮件)。

让我们看看将这两个文件连接成一个数据帧的代码。

1
2
3
import pandas as pd
df = pd.concat(map(pd.read_csv, ['/content/drive/MyDrive/emails.csv','/content/drive/MyDrive/spambase_csv.csv']))
df

在此 cide 代码片段中,我们首先将 Pandas 库导入为 pd。

接下来我们使用map函数将pd.read_csv函数应用于两个数据集。

如果与我们的map函数的语法相比,

函数-read_csv
可迭代emails.csv– , spambase_csv.csv.

连接的数据帧存储在名为 df 的变量中。

多个 CSV 文件的串联 2

使用 for 循环连接目录中的所有文件

在此示例中,我们将为需要的 CSV 文件创建一个文件夹,然后运行 ​​for 循环来读取每个文件并使用空列表来连接它们。

首先让我们知道我们正在处理哪些数据集。

Ball_by_Ball.csv

该数据集与某场比赛相关,记录了每个投掷的球。它具有以下属性。

  • 匹配ID
  • 局数_ID
  • Over_Id
  • 球号
  • 团队击球 ID
  • 团队_保龄球_Id
  • 前锋ID
  • 前锋击球位置
  • 非前锋 ID
  • Bowler_Id

匹配.csv

该数据集包含某些球队所参加的所有比赛的详细信息。

它具有以下标签。

  • 匹配ID
  • 比赛日期
  • 团队名称_ID
  • Opponent_Team_Id
  • Season_Id
  • 地点_名称
  • Toss_Winner_Id
  • 投掷决定
  • IS_超级
  • IS_结果 Is_DuckWorthLewis
  • 赢类型
  • Won_By Match_Winner_Id
  • Man_Of_The_Match_Id
  • 第一裁判员 ID
  • 第二裁判员 ID
  • 城市名
  • 主办国

Player_Match.csv

该数据集是所有数据集中最小的。它包含比赛球员的详细信息。

该数据集中的标签是:

  • 匹配ID
  • 玩家ID
  • 团队ID
  • Is_Keeper
  • 是_队长

现在让我们看一下代码

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import os
path='/content/drive/MyDrive/IPL'
files = [f for f in os.listdir(path) if f.endswith('.csv')]
li = []
for file in files:
    df = pd.read_csv(os.path.join(path, file))
    li.append(df)
df = pd.concat(li, axis=0, ignore_index=True)
df.columns

在前两行中,我们导入 pandas 库和 os 模块。

os 模块用于与操作系统交互。

接下来,我们创建一个名为 path 的变量来存储 CSV 文件所在目录的路径。

接下来,我们创建一个名为 files 的变量,该变量在 for 循环中用作迭代器来读取所有 CSV 文件。

os模块listdir的 用来返回目录中的所有文件。

我们只会读取以.csv扩展名结尾的文件。

创建一个空列表来存储读取文件的结果。

所有文件都使用pd.read_csvdf 读取并存储在变量中。

数据帧附加到空列表 li 中。

接下来,使用 concat 方法将所有数据帧合并为一个数据帧。

df.columns用于打印数据框中所有列的名称。

Df 列

下面给出了连接的数据框。

多个 CSV 文件的串联 3

结论

为了总结我们在这篇文章中看到的所有内容,我们通过示例、CSV 文件格式了解了 Pandas 数据框,并使用pd.read_csv.

接下来,我们看到需要将多个 CSV 文件连接到一个数据框中。

我们还观察了 CSV 文件下载后的样子。我们还学习了如何使用df,drop函数删除不相关的数据框列。

我们已经学习了这篇文章主角的语法pd.concat,并详细了解了它的参数。

来看示例,首先,我们看到了解决此问题的幼稚且耗时的方法。

我们导入了不同的 CSV 文件,读取它们并为每个文件获取了一个数据框。然后,所有这些数据帧都作为参数传递给该pd.concat方法。

来到第二个例子,我们看到了更好的方法。

我们使用该map函数将该pd.read_csv方法一次应用于所有文件。

我们还看到了map函数的语法。

最后,我们创建了一个目录将所有文件存储在一个地方,并使用 os 模块的功能和 for 循环来读取 CSV 文件。


数据集

您可以在此处找到 CSV 示例以及最后一个示例中使用的 IPL 数据集。

在此处查找第一个示例中使用的英国 COVID-19 调查数据集。

在此处查找 emails.csv 文件。

您可以从此处下载垃圾邮件分类文件。


参考

请访问 Pandas 官方文档以了解有关 concat 方法的更多信息。

另请查看 DataFrame.drop 的文档。

查看地图功能的插图。