我们在处理数据的时候,有时候需要将两个或多个Dataframe表处理成一个,至于怎么变成一个,就是我们项目具体的需求了。要了解更多的操作,请点击链接查看。
concat()函数一般是若干个数据结构相同的表格进行拼接。在看这个函数的参数之前,先看一个最常用,也最简单的用例:
现在有三个DataFrame表:df1、df2、df3,列名columns相同,而索引index不同,直接合并就是下面这样的结果:
>>> import pandas as pd >>> 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]) >>> df1 A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 >>> 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]) >>> df2 A B C D 4 A4 B4 C4 D4 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7 >>> 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]) >>> df3 A B C D 8 A8 B8 C8 D8 9 A9 B9 C9 D9 10 A10 B10 C10 D10 11 A11 B11 C11 D11 >>> frames = [df1, df2, df3] >>> result = pd.concat(frames) >>> result A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 4 A4 B4 C4 D4 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7 8 A8 B8 C8 D8 9 A9 B9 C9 D9 10 A10 B10 C10 D10 11 A11 B11 C11 D11图片展示更形象:
有了直观的认识,现在来看concat()函数的参数:
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)参数解释:
objs :序列或数据名称对象的序列或映射。其实就是前面说的表。
axis:{0,1,…},默认为0。要连接的轴。若只有二维,则axis=0表示列连接,axis=1表示行连接。
join : 两个参数:{’ inner ', ’ outer ‘}。默认为’ outer ',表示如何处理其他轴上的索引。外表示并集,内表示交集。
ignore_index : 布尔类型,默认是False。如果为True,则不要在连接轴上使用索引值,那么得到的轴将被标记为0,…,n - 1。如果要连接连接轴没有有意义的索引信息的对象,那么这是非常有用的。注意,其他轴上的索引值在连接中仍然被保留。
keys : 序列类型,默认为None。使用这个keys作为最外层构造分层索引index。如果要弄多个级别的索引,则应该包含元组。不懂了看例子:
result = pd.concat(frames, keys=['x', 'y', 'z'])其实就是人为定义了个index,就这么简单。作用就是:可以通过键选择出每个块,如下:
>>> result.loc['y'] A B C D 4 A4 B4 C4 D4 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7levels : 列表序列,默认为None。用于构造多索引的特定级别(唯一值)。否则它们将从keys中推断出来。
names : 列表类型,默认为None。生成的层次索引中的级别的名称。
verify_integrity : boolean类型, 默认 False。检查新的连接的轴是否包含重复项。
copy :boolean类型, 默认 True。如果为False,则不复制不必要的数据。
请注意:
concat()( 以及append(),后面讲 )会生成数据的完整副本,而不断重用该函数会造成显著的性能损失。如果需要对多个数据集使用该操作,请使用列表封装。
frames = [ process_your_file(f) for f in files ] result = pd.concat(frames)对于concat()操作,一个有用的快捷方式是Series和DataFrame上的append()实例方法。沿axis=0进行拼接,即索引。
result = df1.append(df2)结果: 在DataFrame的情况下,索引必须是不相交的,但列可以:
result = df1.append(df4, sort=False)结果: append()也可以采取多个对象连接:
result = df1.append([df2, df3])pandas提供的函数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)参数解释:
left: 一个DataFrame对象 或者Series 对象;
right: 另一个DataFrame对象 或者Series对象;
on: 指定连接键,一般指定的也是两个表的公共列,on可以指定一个或多个连接键 如pd.merge(df1,df2,on=‘学号’)
例子:
In [39]: left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], ....: 'A': ['A0', 'A1', 'A2', 'A3'], ....: 'B': ['B0', 'B1', 'B2', 'B3']}) ....: In [40]: right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], ....: 'C': ['C0', 'C1', 'C2', 'C3'], ....: 'D': ['D0', 'D1', 'D2', 'D3']}) ....: In [41]: result = pd.merge(left, right, on='key')结果:
例子:
In [42]: left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], ....: 'key2': ['K0', 'K1', 'K0', 'K1'], ....: 'A': ['A0', 'A1', 'A2', 'A3'], ....: 'B': ['B0', 'B1', 'B2', 'B3']}) ....: In [43]: right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'], ....: 'key2': ['K0', 'K0', 'K0', 'K0'], ....: 'C': ['C0', 'C1', 'C2', 'C3'], ....: 'D': ['D0', 'D1', 'D2', 'D3']}) ....: In [44]: result = pd.merge(left, right, on=['key1', 'key2'])结果:
left_on:用于作为键的来自左DataFrame或Series的列或索引级别。可以是列名、索引级别名或长度等于数据名称或序列长度的数组。
right_on:用于作为键的来自右DataFrame或Series的列或索引级别。可以是列名、索引级别名或长度等于数据名称或序列长度的数组。
left_index:如果为True,则使用来自左侧DataFrame或Series的索引(行标签)作为其连接键。
right_index: 如果为True,则使用来自右侧DataFrame或Series的索引(行标签)作为其连接键。
how: ‘left’, ‘right’, ‘outer’, 'inner’之一,默认是inner。 (1)内连接(how=‘inner’),两表做交集,采用公共部分 (2)左连接(how=‘left’),以左表为基础,右表往左表上拼接(左表全保留,右表根据左表增删,左表中有、右表没有的部分,拼接过来用NaN填充) (3)右连接(how=‘right’),以右表为基础,其他同上 (4)外连接(how=‘outer’),两表做并集,缺失的部分用NaN填补 注:非连接列出现重复列名时,merge()会自动添加后缀_x,_y,_z等,可通过suffixes=[’_L’,’_R’]等方式修改
例子1:
result = pd.merge(left, right, how='left', on=['key1', 'key2'])结果: 例子2:
result = pd.merge(left, right, how='right', on=['key1', 'key2'])结果: 例子3:
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])结果: 例子4:
result = pd.merge(left, right, how='inner', on=['key1', 'key2'])结果:
sort:默认为True,将合并的数据进行排序,设置为False可以提高性能。
suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’, ‘_y’)。
copy:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能。
indicator:显示合并数据中数据的来源情况
join()是一种方便的方法,主要用于索引上的合并。可以将两个可能具有不同索引的数据变量的列组合为单个结果数据变量。下面是一个非常基本的例子:
In [79]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'], ....: 'B': ['B0', 'B1', 'B2']}, ....: index=['K0', 'K1', 'K2']) ....: In [80]: right = pd.DataFrame({'C': ['C0', 'C2', 'C3'], ....: 'D': ['D0', 'D2', 'D3']}, ....: index=['K0', 'K2', 'K3']) ....: In [81]: result = left.join(right)结果:
In [82]: result = left.join(right, how='outer')结果:
In [83]: result = left.join(right, how='inner')结果:
要了解更多,请点击: 链接