#文章首发于公众号“如风起”。
原文链接:Python随笔 | Pandas入门(二)mp.weixin.qq.comPandas是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 Librarypandas.pydata.org
Pandas的内容是非常的多的,使用也很灵活。在这个系列,我想尽可能详细的总结Pandas在日常中的使用,以及一些小技巧。因为内容比较多,所以,计划分为三四个部分,最后可能会写一个实例应用,或者注意事项。有错误、不足或是需要补充的地方,欢迎大家私信我。
本期内容Pandas数据的合并
Pandas数据的合并
Pandas有四个常用的函数来合并数据集,分别是concat、append、merge和join函数。文章中的函数使用演示所用数据来自Pandas官方文档。
一、concat函数的用法concat函数是pandas底下的方法,可以将数据依据不同的轴作简单的合并。concat函数的语法格式为:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None,
levels=None, names=None, verify_integrity=False, copy=True)各参数的含义如下:
其中,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横向合并数据集(以并集的方式):
result = pd.concat([df1, df2, df3], axis=1)
result以交集的方式横向合并数据集
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
2.合并数据集df1与df4(合并方式为"inner")
result = pd.concat([df1, df4], axis=1, join='inner')
result引入keys,建立层次化索引引入keys以便我们在合并后的数据集中能够识别出数据集来自哪一个数据集。
result = pd.concat([df1, df2, df3], keys=['x', 'y', 'z'])
result
我们可以通过keys来选择数据,例如:
result.loc['y']忽略索引合并数据集如果原始数据集的所有没有意义,且合并之后不需要原始的索引,则可以设置忽略索引。
result = pd.concat([df1, df4], ignore_index=True)
result
二、append函数的用法append是series和dataframe的方法,append函数拼接数据集默认是沿着列进行拼接(axis=0)。
演示append函数的使用合并数据集df1与df2
result = df1.append(df2)
result合并多个数据集,例如合并df1、df2与df3
result = df1.append([df2, df3])
result
三、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函数一些主要参数的含义:当我们合并的数据集时,依据的关键指标列在两个表中的表示是不同的,则可以通过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通过多个列名合并数据集(使用默认拼接方式)
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通过多个列名合并数据集(保留左表数据)
result = pd.merge(left, right, how='left', on=['key1', 'key2'])
result通过多个列名合并数据集(保留右表数据)
result = pd.merge(left, right, how='right', on=['key1', 'key2'])
result通过多个列名合并数据集(保留两个表的所有数据)
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
result通过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
上述拼接的实现还可以按如下方式实现:
result = pd.merge(left, right, left_on='key', right_index=True)
result
四、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
上述数据集的合并也可以使用merge函数。
result = pd.merge(left, right, left_on='key', right_index=True, how='left')
result连接多个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
此外,Pandas还有combine_first和update这两个比较常用函数,这两个函数都是用来更新表格数据的。
如果一个表中存在nan值,而这个nan值在另一个表中同样的位置可以找到,那么就可以用combine_first来更新数据。
如果需要用一张表中的数据来更新另一张表的数据则可以用update来实现。combine_first只更新需要更新表的nan值。而update则会更新需要更新表格的所有能在另一个表中找到的值(两表位置相对应)。
关于Pandas的其他的数据合并的方法函数可以查看它的官方文档。