你将很难找到不需要串联的大数据分析项目(将多个数据源组合在一起)。通常,数据分析要求将新行添加到表中,在更复杂的情况下(在更复杂的情况下)拉出更多列,将不同的表合并到一个公共键上。所有这些技巧都可以轻松地放在口袋里,因此不同的数据源不会妨碍你的分析!

  在此串联教程中,我们将逐步介绍几种使用熊猫组合数据的方法。它面向初学者到中级,并且需要了解熊猫DataFrame的基础知识。对SQL和关系数据库的一些事先了解也将派上用场,但不是必需的。我们将分析四种国家的平均年度劳动时间,并介绍四种不同的技术(连接,附加,合并和合并)。我们还将在每个步骤之后创建一个图,以便我们直观地了解每种数据组合技术所产生的不同结果。作为奖励,你将在大数据分析Pandas和Python如何合并数据表中获得有关全球劳动力趋势的见解以及可添加到你的投资组合中的漂亮图表集!

  我们将在经济合作与发展组织(OECD)中扮演宏观经济分析师的角色。我们试图回答的问题很简单,但很有趣:哪个国家的公民投入了最长的工作时间,这些趋势随着时间的推移如何变化?不幸的是,经合组织一直在分别收集不同大陆和不同时期的数据。我们的工作是首先将所有数据放在一个位置,以便我们进行必要的分析。

  访问数据集

  在此处下载教程数据文件

  我们将使用来自OECD就业和劳动力市场统计数据库的数据,该数据库提供了可追溯至1950年的大多数发达国家的平均年度劳动小时数据。在大数据分析Pandas和Python如何合并数据表中,我将互换使用DataFrames和表格。我们将在Python 3中使用Jupyter Notebook(欢迎使用你希望使用的任何IDE(集成开发环境),但是在Jupyter中最容易遵循大数据分析Pandas和Python如何合并数据表)。启动后,让我们导入pandas和matplotlib库,然后使用%matplotlb inlineJupyter知道如何在笔记本单元格中显示图。如果我提到的任何工具听起来都不熟悉,建议你参阅AAA教育入门指南。

  

python合并多个列数组 python如何合并列表_python合并多个列数组

 

  接下来,我们将使用该pd.read_csv()函数打开前两个数据文件。我们将通过传递参数指定将第一列用作行索引index_col=0。最后,我们将显示初始表的外观。

  

python合并多个列数组 python如何合并列表_图例_02

 

  经过一番观察,我们发现行是国家,列是年,单元格值是每位员工的平均每年工作时间。尽管DataFrames辉煌,但乍一看仍然很难理解,因此我们将使用matplotlib的DataFrame.plot()方法为我们的年度劳动趋势创建折线图,进行一些绘图。

  

python合并多个列数组 python如何合并列表_大数据分析_03

 

  哇,那不是我们想要的!默认情况下,该DataFrame.plot()方法将行视为x轴标签,将单元格值视为y轴标签,将列视为线。此处的快速解决方案是使用DataFrame.transpose()方法在DataFrame上旋转轴。为了使可视化效果更加出色,我们将title='string'在plot方法中使用参数添加标题。我们可以将这些方法链接在一起,然后用于plt.show()整齐地显示我们的折线图,而绘图上方没有matplotlib文本行。

  

python合并多个列数组 python如何合并列表_数据_04

 

  连接美洲数据

  看起来我们在north_americaDataFrame中有三个国家,在DataFrame中有一个国家south_america。由于这些是在两个单独的图中,因此很难比较南美和北美的平均劳动时间。如果我们能够将所有国家/地区纳入同一个数据框,则进行此活动会容易得多。

  对于需要添加相同长度的行或列的简单操作,此pd.concat()功能非常理想。我们要做的就是按照我们希望它们串联的顺序传递一个DataFrame对象列表。

  

python合并多个列数组 python如何合并列表_图例_05

 

  a)轴:我们将沿着行(0)还是沿列(1)串联

  b)join:可以设置为内部,外部,左侧或右侧;大数据分析Pandas和Python如何合并数据表后面将更详细地解释

  c)ignore_index:是否应保留原始行标签

  在我们的例子中,我们可以保留所有默认参数的原样,而只需传入我们north_america和south_americaDataFrames。

  

 

python合并多个列数组 python如何合并列表_图例_06

  这看起来是一个不错的开始,但是我们希望我们的数据尽可能的新。以后几年要求提供这四个国家/地区的数据后,数据收集团队从2011年到2015年每年通过单独的CSV文件向我们发送以下信息:

  [americas_2011.csv , americas_2012.csv, americas_2014.csv, americas_2015.csv]

  让我们使用一个for循环以及该string.format()方法自动执行该过程的方法来加载新数据。我们将把我们之前的americasDataFrame放在一个名为的列表中,americas_dfs并将每个新DataFrame追加到该列表中。最后,我们将americas_2011使用列表索引显示DataFrame。

  

python合并多个列数组 python如何合并列表_大数据分析_07

 

  你可能会注意到的一件事是,americas_2011我们刚打印的DataFrame中的行与DataFrame的顺序americas不同(熊猫自动将它们按字母顺序排列)。幸运的是,该pd.concat()函数将数据连接到索引标签(在我们的情况下为国家)中,而不是顺序中,因此在连接期间不会出现问题。如果我们想按当前顺序将行连接起来,则可以传递参数ignore_index=True。这将导致为索引分配整数序列。同样重要的是要记住,我们必须按照希望将其串联的顺序创建DataFrame列表,否则我们的年份将不按时间顺序排列。

  我们不能使用与pd.concat()上次完全相同的功能,因为现在我们要添加列而不是行。这是轴起作用的地方。默认情况下,参数设置为axis=0,这意味着我们正在串联行。这次,我们将需要传递axis=1以指示我们要串联列。请记住,这仅在所有表都具有相同的高度(行数)的情况下起作用。

  

python合并多个列数组 python如何合并列表_图例_08

 

  堆栈溢出

  沿轴1连接时要记住的一个警告是行索引的标题“国家”将被删除。这是因为pandas不确定该标题是否适用于已添加的新行标签。我们可以通过分配DataFrame.index.names属性轻松地解决此问题。然后,让我们作另一个图以了解我们的位置。

  

python合并多个列数组 python如何合并列表_大数据分析_09

 

  

python合并多个列数组 python如何合并列表_图例_10

 

  

python合并多个列数组 python如何合并列表_数据_11

 

  追加其他大洲的数据

  既然我们已经全面了解了美洲,那么我们想看看它与世界其他地区的比较。数据收集团队已为2000年至2015年为亚洲,欧洲和南太平洋提供了CSV文件。让我们加载这些文件并进行预览。由于europe是一张高得多的桌子,我们将利用该DataFrame.head()方法通过仅显示前5行来节省空间。

  

python合并多个列数组 python如何合并列表_python合并多个列数组_12

 

  

python合并多个列数组 python如何合并列表_数据_13

 

  

python合并多个列数组 python如何合并列表_图例_14

 

  当你只想添加称为DataFrame.append()方法的新行时,Pandas有一个快捷方式。语法略有不同–因为它是DataFrame方法,所以我们将使用点表示法在americas对象上调用它,然后将新对象作为参数传递。

  

python合并多个列数组 python如何合并列表_数据_15

 

  看起来这些新的DataFrames已全部用了16年。如果我们尝试追加的数据中缺少任何列,则将导致这些行NaN的单元格中的值落在缺少的年列之下。让我们运行append方法,并验证通过print正确地附加了所有国家DataFrame.index。然后,我们可以绘制折线图以查看新附加数据的外观。

  

python合并多个列数组 python如何合并列表_数据_16

 

  

python合并多个列数组 python如何合并列表_python合并多个列数组_17

 

  自定义可视化

  具有所有36个国家/地区的新DataFrame很棒,但是圣洁的行为确实使我们的计划变得混乱!在继续之前,请查看你是否可以发现我们的可视化存在的三个问题。

  首先,我们要使图更大,以便可以以更高的保真度看到所有这些新数据点。如果我们传递figsize=(10,10)参数,这是一个非常容易的解决方案,元组指定了绘图图的尺寸。你可能还已经注意到,有36条线代表我们所有不同的国家,但是颜色在重复。这是因为默认的颜色图仅包含10种不同的颜色,但是我们将需要更多的颜色。我查看了matplotlib colormaps文档,并决定使用彩虹图,可以将其作为传递colormap='rainbow'。由于我们要放大图表,因此我也想使用较粗的线,所以我要设置linewidth=2。

  最后,我们将解决图例中重叠的图例。这可以通过plt.legend()功能来完成。我们将传入loc='right'以指示我们想要图右侧的图例框。你可以对其进行测试,并发现它与图的边界不完全对齐。我们可以对bbox_to_anchor=(1.3,0.5)参数进行一些微调。我们传入的元组是图例框相对于图的位置坐标。我一直在研究这些值,直到找到一个可以排列的值,但是如果你喜欢不同的美学,可以随时修改这四个参数中的任何一个。

  

python合并多个列数组 python如何合并列表_python合并多个列数组_18

 

  

python合并多个列数组 python如何合并列表_数据_19

 

  连接入门

  对于那些在SQL之类的关系数据库中进行联接的经验丰富的人,这里有一些好消息:pandas提供了高性能的内存中合并和联接选项。当我们需要组合非常大的DataFrame时,联接是快速执行这些操作的有力方法。

  需要牢记的几个重要事项:一次只能在两个DataFrame上进行连接,分别表示为左表和右表。该键是普通列,这两个DataFrames将加入的。最好使用在整个列中具有唯一值的键,以避免行值的意外复制。

  有四种处理联接的基本方法(内部,左侧,右侧和外部),具体取决于哪些行必须保留其数据。下面的维恩图将帮助你直观地理解这些连接。考虑将蓝色区域作为键列的一部分,它将保留在最终表中。

  一个内连接是最简单的联接,这样只会保留其中两个表共用一个键值的行。

  

python合并多个列数组 python如何合并列表_大数据分析_20

 

  一个左连接不断出现在主(左)表中的所有行,右表仅将对把它分享与左的一个关键值的行串连。NaN将为没有匹配键值的单元格填充值。

  

python合并多个列数组 python如何合并列表_python合并多个列数组_21

 

  一个右连接是同一个概念作为左加入,但保持在右表中出现的所有行。所得的DataFrameNaN在左侧将具有任何可能的值。

  

python合并多个列数组 python如何合并列表_大数据分析_22

 

  最后,完全外部NaN联接保留了两个表中都出现的所有行,并且值可以显示在结果DataFrame的任一侧。

  

python合并多个列数组 python如何合并列表_数据_23

 

  合并历史劳工数据

  很高兴能够看到自2000年以来的工时变化,但是为了看到真实的趋势,我们希望能够看到尽可能多的历史数据。数据收集团队非常友好,可以发送从1950年到2000年的数据,让我们将其加载并进行查看。

  

python合并多个列数组 python如何合并列表_大数据分析_24

 

  你会注意到其中有很多NaN价值,尤其是在早期。这仅意味着在较早的年份中没有收集到这些国家的数据。在这些单元格中放入0会产生误导,因为这意味着该年没有人花任何时间工作!而是NaN代表一个空值,表示“不是数字”。具有空值不会影响我们的DataFrame合并,因为我们将使用行标签(索引)作为键。

  合并时,请务必记住将从每个表保留哪些行。我不确定表的完整尺寸是多少,因此,除了显示全部内容之外,我们还可以查看感兴趣的事实。让我们打印DataFrame.shape()属性以查看包含(总行,总列)的元组对于两个表。

  

python合并多个列数组 python如何合并列表_图例_25

 

  请注意,即使我们仅分析世界表中的36个国家,历史表也有39行。通过适当的DataFrame合并,可以自动处理掉多余的三行。我们将把它world作为主表,希望它在结果DataFrame的右侧,而历史在左侧,因此年份(列)按时间顺序排列。这两个表中的列都是不同的,这意味着我们将必须找到要连接的键。在这种情况下,键将是行索引(国家/地区)。

  我们将要使用该pd.merge()函数进行正确的联接,并使用索引作为联接的键。

  

python合并多个列数组 python如何合并列表_图例_26

 

  使用此函数时,前两个参数将始终分别为左和右DataFrame。然后,我们要设置left_index=True并right_index=True指定索引将是我们的键值,因此我们可以将国家/地区保留为行标签(否则熊猫会将行索引更改为整数序列。)最后,我们传入how='right'以指示正确的加入。

  正确的联接将确保我们仅保留正确表中的36行,并丢弃历史记录表中多余的3行。让我们打印生成的DataFrame的形状并显示头部,以确保一切都正确。

  

python合并多个列数组 python如何合并列表_python合并多个列数组_27

 

  更快的加入方式

  现在,我们已经完成了艰苦的工作,并从概念上理解了表合并,现在让我们尝试一种更优雅的技术。熊猫有一个干净的方法可以加入索引,这非常适合我们的情况。

  

python合并多个列数组 python如何合并列表_python合并多个列数组_28

 

  该DataFrame.join()方法允许我们在左表上使用点符号,然后将右表how作为参数传递。这样就无需像在上一个函数中那样指定左右索引参数。如果为on=None,则连接键将为行索引。让我们通过查看DataFrame头来观察空值如何影响我们的分析。

  

python合并多个列数组 python如何合并列表_图例_29

 

  看起来很多行在DataFrame的左侧都有空值,正如我们期望的那样,使用右连接。在绘制最终的折线图之前,最好按字母顺序对行进行排序,以使图例更易于读者阅读。可以使用DataFrame.sort_index()方法执行。我们可以传入参数inplace=True以避免重新分配world_historical变量。然后,只需重用我们最近的vizualization中的matplotlib代码即可显示我们最终排序的DataFrame。

  

python合并多个列数组 python如何合并列表_python合并多个列数组_30

 

  

python合并多个列数组 python如何合并列表_图例_31

 

  放在一起(双关语意)

  哇,既然我们对半个多世纪以来的劳动趋势有了很大的了解,那么我们的可视化效果就令人印象深刻。成为80年代的工人肯定会筋疲力尽!

  总结一下:

  1)pd.concat() 功能:用途最广,可用于沿任一轴组合多个DataFrame。

  2)DataFrame.append() 方法:将行添加到DataFrame的快速方法,但不适用于添加列。

  3)pd.merge() 函数:当我们有一个包含公用值的列(键)时,非常适合将两个DataFrame结合在一起。

  4)DataFrame.join() 方法:连接两个DataFrame的一种更快的方法,但是仅在索引标签上起作用,而不是在列上起作用。