目录
4.1 pandas.Series.combine_first
4.1.1 Series.combine_first 函数语法
4.2 pandas.DataFrame.combine_first
4.2.1 DataFrame.combine_first函数语法
4.2.2 DataFrame.combine_first 实例
在数据分析和建模的工作中,需要对数据进行规整:加载、清理、转换以及重塑等。
本文总结梳理Python标准库和Pandas用于数据集合并的两种方法:pandas.merge,pandas.concat,pandas.DataFrame.join,combine_first。
参考书籍《利用Python进行数据分析》
1 pandas.merge
数据集的merge合并是通过一个或多个键key将行链接起来。
1.1 merge函数的语法
pandas.
merge
(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
主要参数:
参数 | 说明 |
left | 参与合并的左侧DataFrame |
right | 参与合并的右侧DataFrame |
how | “inner”,“outer”,“left”,“right”其中之一。默认为“inner” |
on | 用于连接的列名。必须存在于左右两个DataFrame对象中。 如果未指定,且其他连接键也未指定,则以left和right列名的交集作为连接键 |
left_on | 左侧DataFrame中用作连接键的列 |
right_on | 右侧DataFrame中用作连接键的列 |
left_index | 将左侧的行索引用作其连接键 |
right_index | 将右侧的行索引用作其连接键 |
sort | 根据连接键对合并后的数据进行排序,默认为False,按照合并的方式how进行排序。 如果为True,按照连接键名的字母顺序排序 |
suffixes | 字符串值元祖,用于追加到重叠列名的末尾,默认为('_x','_y')。 例如,如果左右两个DataFrame对象都有'data',则结果中就会出现'data_x' 和 'data_y' |
copy | 设置会False,可以在某些特殊情况下避免将数据复制到结果数据中。默认总是复制。 |
1.2 单一键上合并
1.2.1 key名相同
import pandas as pd
import numpy as np
df1 = pd.DataFrame({"key":["b","b","a","c","a","a","b"],"data1":range(7)})
df2 = pd.DataFrame({"key":["a","b","d"],"data2":range(3)})
pd.merge(df1,df2, on="key") # merge默认的方式是inner
df1: df2: pd.merge(df1,df2, on="key")
上述是一种多对一的合并。函数中如果没有指定on="key"也是可以的,默认选择两个dataframe中相同的key来连接。
但,建议还是要显式表达出来。
1.2.2 两者key名不同
这种情况,可以用left_on 和 right_on 分别指定。
df3 = pd.DataFrame({"lkey":["b","b","a","c","a","a","b"],"data1":range(7)})
df4 = pd.DataFrame({"rkey":["a","b","d"],"data2":range(3)})
pd.merge(df3,df4,left_on="lkey",right_on="rkey")
df3: df4: merge函数作用后
默认merge连接方式为inner,即求df3和df4的交集,所以c,d对应的数据在上述结果中消失了。并集,可以设置参数how='outer'。
1.3 多个键上合并
多个键上合并,需要设置参数on,传入一个列名组成的列表做为参数即可。
left = pd.DataFrame({"key1":['foo','foo','bar'],"key2":['one','two','one'],'lval':[1,2,3]})
right = pd.DataFrame({"key1":['foo','foo','bar','bar'],"key2":['one','one','one','two'],'rval':[4,5,6,7]})
pd.merge(left,right,on=["key1","key2"],how="outer")
left: right: merge函数作用后
1.4 连接键key之外,合并数据中两者存在重复列名
如果将上述创建的left表和right表,仅按照key1进行合并,两者都存在key2这一相同的列名,如何在合并后的dataframe中加以区分呢?
merge有一个很实用的suffixes参数,默认是在重复的列名后面加上(‘_x’, ‘_y’)。
left = pd.DataFrame({"key1":['foo','foo','bar'],"key2":['one','two','one'],'lval':[1,2,3]})
right = pd.DataFrame({"key1":['foo','foo','bar','bar'],"key2":['one','one','one','two'],'rval':[4,5,6,7]})
pd.merge(left,right,on=["key1"])
left: right: merge函数作用后