pandas concat_Python随笔 | Pandas入门(二)

#文章首发于公众号“如风起”。

原文链接:

Python随笔 | Pandas入门(二)​mp.weixin.qq.com
e307081ab5a1e2fa0174aa0d253b6059.png
​Pandas是Python的一个基于NumPy的数据分析包,最初被作为金融数据分析工具由AQR Capital Management在2008年4月开发,并于2009年底开源出来。
Pandas的名称来自于经济学的术语面板数据(panel data)和python数据分析(data analysis)。

Pandas可以说是目前Python下最强大的数据分析和探索工具。Pandas包含高级的数据结构和精巧的工具,使得其在矩阵的处理、计算上存在很大的优势,所以利用Pandas在Python中处理数据非常快速、简单。

关于Pandas的更多信息,可以浏览其官网。想要更加详细具体的学习Pandas,可以查看Pandas的官方文档。

Python Data Analysis Library​pandas.pydata.org

47e2ca2a12369ee71b66bc32ad14e3ac.png

Pandas的内容是非常的多的,使用也很灵活。在这个系列,我想尽可能详细的总结Pandas在日常中的使用,以及一些小技巧。因为内容比较多,所以,计划分为三四个部分,最后可能会写一个实例应用,或者注意事项。

有错误、不足或是需要补充的地方,欢迎大家私信我。

本期内容

Pandas数据的合并

Pandas数据的合并

Pandas有四个常用的函数来合并数据集,分别是concat、append、merge和join函数。文章中的函数使用演示所用数据来自Pandas官方文档。

一、concat函数的用法

concat函数是pandas底下的方法,可以将数据依据不同的轴作简单的合并。
  • concat函数的语法格式为:
pd
  • 各参数的含义如下:

4df191fad1e07c5807ce5c4a03f06145.png

其中,concat的基本语法为:

#默认axis=0,合并方式为"outer"
pd.concat(objs)
#等价于
pd.concat(objs, axis=0, join='outer')

演示concat函数的使用。

  • 首先导入Pandas
import pandas as pd
  • 简单合并数据集(默认axis=0,纵向合并,合并方式为"outer"并集)
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])
​
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                   index=[4, 5, 6, 7])
​
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                   index=[8, 9, 10, 11])
​
result = pd.concat([df1, df2, df3])
result

63252add7ad1cbc70866772e56b2dbd5.png
  • 横向合并数据集(以并集的方式):
result = pd.concat([df1, df2, df3], axis=1)
result

9487e9bbc1a94308db804a8ba657ef8c.png
  • 交集的方式横向合并数据集

1.引入一个新数据集df4

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[2, 3, 6, 7])
df4

ea0313e294453c943acc059d835dfb67.png

2.合并数据集df1df4(合并方式为"inner")

result = pd.concat([df1, df4], axis=1, join='inner')
result

b32bf4098bfc20f78bc2579e6cfd8ea5.png
  • 引入keys,建立层次化索引
引入keys以便我们在合并后的数据集中能够识别出数据集来自哪一个数据集。
result = pd.concat([df1, df2, df3], keys=['x', 'y', 'z'])
result

d83c0fabdc7d2cbc855e16b2cd98e993.png

我们可以通过keys来选择数据,例如:

result.loc['y']

7f6af805ec3268fdfed7f2abf94e357c.png
  • 忽略索引合并数据集
如果原始数据集的所有没有意义,且合并之后不需要原始的索引,则可以设置忽略索引。
result = pd.concat([df1, df4], ignore_index=True)
result

15876499fa10089187d21f5205310d5c.png

二、append函数的用法

append是series和dataframe的方法,append函数拼接数据集默认是沿着列进行拼接(axis=0)。

演示append函数的使用

  • 合并数据集df1df2
result = df1.append(df2)
result

682105b626c9939b52f566671689f14e.png
  • 合并多个数据集,例如合并df1df2df3
result = df1.append([df2, df3])
result

63252add7ad1cbc70866772e56b2dbd5.png

三、merge函数的用法

merge方法提供了一种类似于SQL的内存链接操作,官网文档讲到它的性能会比其他开源语言的数据操作(例如R)要高效。
Pandas和其他主流数据分析工具(R、SAS、SQL等)的具体比较可以查看官方文档。
  • merge函数的语法格式是:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
         left_index=False, right_index=False, sort=True,
         suffixes=('_x', '_y'), copy=True, indicator=False,
         validate=None)
  • merge函数一些主要参数的含义:

546ce8202b90041cdea8bbb737d31a5a.png
当我们合并的数据集时,依据的关键指标列在两个表中的表示是不同的,则可以通过left_on/right_on与left_index/right_index的组合来实现合并。

演示merget函数的使用

  • 简单合并数据集(连接方式默认为"inner"交集,关键词on自动选择为"key")
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                       'C': ['C0', 'C1', 'C2', 'C3'],
                       'D': ['D0', 'D1', 'D2', 'D3']})

result = pd.merge(left, right)
result

fe3e626a2412f8b629b1f1e4a627b180.png
  • 通过多个列名合并数据集(使用默认拼接方式)
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
#没有设置how,默认为inner。
result = pd.merge(left, right, on=['key1', 'key2'])
result

8a48f73f26e499cfedd97a28c025dbbd.png
  • 通过多个列名合并数据集(保留左表数据)
result = pd.merge(left, right, how='left', on=['key1', 'key2'])
result

49c4918035acfd436679d47f233c2c86.png
  • 通过多个列名合并数据集(保留右表数据)
result = pd.merge(left, right, how='right', on=['key1', 'key2'])
result

b11966df54b35b4ac11b64dd9077f846.png
  • 通过多个列名合并数据集(保留两个表的所有数据)
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
result

4d8f091d4b2c42e77680d926f6c9c5ba.png
  • 通过left_on/right_on与left_index/right_index的组合合并数据集
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3'],
                     'key': ['K0', 'K1', 'K0', 'K1']})

right = pd.DataFrame({'C': ['C0', 'C1'],
                      'D': ['D0', 'D1']},
                     index=['K0', 'K1'])

result = pd.merge(left, right, left_on='key', right_on=right.index)
result

d6a0c09a7dde32792137657c1d9a481a.png

上述拼接的实现还可以按如下方式实现:

result = pd.merge(left, right, left_on='key', right_index=True)
result

e6681b7a6bb865bd73657868de15701d.png

四、join函数的用法

join函数是dataframe内置的一种快速合并数据集的方法。它默认以index作为对齐的列。
  • join函数的语法格式是:
left.join(right, how='inner', on=key_or_keys)

其中,how参数和merge中的how参数一样,用来指定表合并保留数据的规则。

on表示一列或多个列名,在实际应用中如果右表的索引值正好是左表的某一列的值,这时可以通过将右表的索引和左表的列对齐合并这样灵活的方式进行合并。

演示join函数的使用

  • 合并数据集
左表 left有一个"key"列,右表right的索引是左表"key"列的内容,所以可以通过join函数合并数据集。
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3'],
                     'key': ['K0', 'K1', 'K0', 'K1']})

right = pd.DataFrame({'C': ['C0', 'C1'],
                      'D': ['D0', 'D1']},
                     index=['K0', 'K1'])

result = left.join(right, on='key')
result

d6a0c09a7dde32792137657c1d9a481a.png

上述数据集的合并也可以使用merge函数。

result = pd.merge(left, right, left_on='key', right_index=True, how='left')
result

83b35bfcefda67ed7d1ac7564f12f5a0.png
  • 连接多个DataFrames

可以通过列表或者元组一次组合多个数据集。

left = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'v': [1, 2, 3]}).set_index('k')
right = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'v': [4, 5, 6]}).set_index('k')
right2 = pd.DataFrame({'v': [7, 8, 9]}, index=['K1', 'K1', 'K2'])

result = left.join([right, right2])
result

698de8238475e5b5c1dec80164183537.png

此外,Pandas还有combine_first和update这两个比较常用函数,这两个函数都是用来更新表格数据的。

如果一个表中存在nan值,而这个nan值在另一个表中同样的位置可以找到,那么就可以用combine_first来更新数据。

4454f5492a16c3ffb6414b9024390eee.png

如果需要用一张表中的数据来更新另一张表的数据则可以用update来实现。

1fb765b8f79a916096269b6836b326b7.png
combine_first只更新需要更新表的nan值。而update则会更新需要更新表格的所有能在另一个表中找到的值(两表位置相对应)。

关于Pandas的其他的数据合并的方法函数可以查看它的官方文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值