目录
1. 数据的纵向合并
df.append(
- other : 希望添加的DF/Series/字典/上述对象的列表,使用列表方式,就可以实现一次合并多个新对象
- ignore_index = False : 添加时是否忽略索引
- verify_integrity = False : 是否检查索引值的唯一性,有重复时报错 )
按行追加拼接,将一个 DataFrame 的行拼接到另外一个 DataFrame 的末尾,返回一个新的 DataFrame。
如果列名不在第一个 DataFrame出现,则将以新的列名添加,没有对应内容的会为空。不会改变原来的 DataFrame,只会创建一个新的 DataFrame,包含拼接的数据。
重点:因为会创建一个新的 index 和 data buffer,所以效率不高。推荐用 pd.concat(),而且 pd.concat() 功能更强大,详情请参考
两个 df 拼接,并保留原索引:
如果列名不在第一个 DataFrame出现,则将以新的列名添加,没有对应内容的会为空。不会改变原来的 DataFrame,只会创建一个新的 DataFrame,包含拼接的数据。
多个 df 拼接,在合并不保留原索引,启用新的自然索引
import pandas as pd
idnumber = [1,2,5]
fname = ['Kate','John','Eli']
age = [10,20,50]
grade = ['A','B','C']
df1 = pd.DataFrame({'id':idnumber,'fname':fname})
df2 = pd.DataFrame({'age':age,'grade':grade})
df3 = pd.DataFrame({'id':[3,4],'age':[30,40]})
print("df1:\n{}".format(df1))
print("df2:\n{}".format(df2))
print("df3:\n{}".format(df3))
df1_append_df2 = df1.append(df2)
print("df1_append_df2:\n{}".format(df1_append_df2))
df1_append_df2_df3 = df1.append([df2,df3], ignore_index = True)
print("df1_append_df2_df3:\n{}".format(df1_append_df2_df3))
2. 数据的横向合并
merge命令使用类SQL的连接方式,pd.merge()方法可以自由灵活地操作各种逻辑的数据连接、合并等操作
pd.merge(
* 需要合并的DF
* left : 需要合并的左侧DF
* right : 需要合并的右侧DF
* how = 'inner' : 具体的连接类型
* {'left', 'right', 'outer', 'inner'}
* 两个DF的连接方式
* on : 用于连接两个DF的关键变量(多个时为列表),必须在两侧都出现
* on:作为连接键的字段,左右数据中都必须存在,否则需要用left_on和right_on来指定
* left_on : 左侧DF用于连接的关键变量(多个时为列表)
* right_on : 右侧DF用于连接的关键变量(多个时为列表)
* left_index = False : 是否将左侧DF的索引用于连接
* right_index = False : 是否将右侧DF的索引用于连接
* 其他附加设定
* sort = False : 是否在合并前按照关键变量排序(会影响合并后的案例顺序)
* suffixes : 重名变量的处理方式,提供长度为2的列表元素,分别作为后缀
* suffixes=('_x', '_y')
* copy = True
* indicator = False : 在结果DF中增加'_merge'列,用于记录数据来源
* 也可以直接提供相应的变量列名
* Categorical类型,取值:'left_only', 'right_only', 'both'
* validate = None : 核查合并类型是否为所指定的情况
* 'one_to_one' or '1:1'
* 'one_to_many' or '1:m'
* 'many_to_one' or 'm:1'
* 'many_to_many' or 'm:m'(实际上不做检查)
* 0.21版新增
)
参数left_index和right_index
除了指定字段作为主键以外,还可以考虑用索引作为拼接的主键,left_index和right_index默认为False,就是不以索引作为主键,调整为True就可以了。
两张表中的记录人员信息仅有部分相同
df2a = pd.read_excel("员工信息表.xlsx", sheet_name = '员工1工号')
print(df2a)
df2b = pd.read_excel("员工信息表.xlsx", sheet_name = '员工2工号')
print(df2b)
#不指定主键的情况下:
pd.merge(df2a, df2b)
#pd.merge()默认的是内连接,所以只把主键信息相同的部分拼接,而工号和员工姓名完全一致的只有工号是004的信息
1. 默认内连接
esult = pd.merge(left, right, on=['key1', 'key2'])
2. 外连接
外连接是保留两个表的所有信息,拼接的时候遇到标签不能对齐的部分,用NAN进行填充:
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
df2a = pd.read_excel("员工信息表.xlsx", sheet_name = '员工1工号')
print(df2a)
df2b = pd.read_excel("员工信息表.xlsx", sheet_name = '员工2工号')
print(df2b)
pd.merge(df2a, df2b,how="outer")
3. 左连接
左连接是保留所有左表的信息,把右表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充: result = pd.merge(left, right, how='left', on=['key1', 'key2'])
df2a = pd.read_excel("员工信息表.xlsx", sheet_name = '员工1工号')
print(df2a)
df2b = pd.read_excel("员工信息表.xlsx", sheet_name = '员工2工号')
print(df2b)
pd.merge(df2a, df2b,how="left")
4. 右连接
右连接是保留所有右表的信息,把左表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充: result = pd.merge(left, right, how='right', on=['key1', 'key2'])
df2a = pd.read_excel("员工信息表.xlsx", sheet_name = '员工1工号')
print(df2a)
df2b = pd.read_excel("员工信息表.xlsx", sheet_name = '员工2工号')
print(df2b)
pd.merge(df2a, df2b,how="right")
5. 参数suffixes
两个表中有好几个相同的列名,除了作为主键的列之外,其他名字相同的列被拼接到表中的时候会有一个后缀表示这个列来自于哪个表格,用于区分名字相同的列,这个后缀默认是(x和y)
pd.merge(df2a, df2b,on="工号",suffixes=("_left","_right"))
3. Concat命令简介
同时支持横向合并与纵向合并
pd.concat(
* objs : 需要合并的对象,列表形式提供
* axis = 0 : 对行还是对列方向进行合并
* {0/'index', 1/'columns'}
* join = 'outer' : 对另一个轴向的索引值如何进行处理
* {'inner', 'outer'}
* ignore_index = False
* keys = None : 为不同数据源的提供合并后的索引值
* verify_integrity = False
* copy = True
)
# 纵向合并
df21 = pd.read_excel("data/高校信息.xlsx", sheet_name = 'part1')
df22 = pd.read_excel("data/高校信息.xlsx", sheet_name = 'part2')
pd.concat([df21, df22])
df2a = pd.read_excel("data/高校信息.xlsx", sheet_name = 'var6')
df2b = pd.read_excel("data/高校信息.xlsx", sheet_name = 'var3')
pd.concat([df2a, df2b], axis = 1)