第一、DataFrame.merge函数
更推荐使用merge()函数。简单介绍点击这里。
1) 函数部分:
-
pandas.merge
是pandas的全功能、高性能的的内存连接操作,在习惯上非常类似于SQL之类的关系数据库。 - 相较于其他开源软件(如R中的
base::merge.data.frame
),pandas.merge
的性能要好得多(在某些情况下好得多一个数量级)。其原因是在DataFrame中优化的算法设计和数据的内部布局。
DataFrame.merge(
right, # 右DF,即要被merge的DataFrame
how='inner', # 取值有4个{‘left’, ‘right’, ‘outer’, ‘inner’}
on=None, left_on=None, right_on=None, # 如果使用左&右DF的公共字段作为key,使用参数on;如果不使用左边右边的公共字段作为key,使用参数left_on和right_on。
left_index=False, right_index=False, # 如果left_index=True,则left左边DF的index(即索引的列名称)是用来jion的keys。如果是MultiIndex,左DF和右DF的level数必须相等。right_index的作用与之相似。
sort=False, # 默认不对新合并表的结果按照字顺序排序,可以节省运算时间。
suffixes=('_x', '_y'),
copy=True,
indicator=False, # 如果True,会添加一列,显示数据的来源表名称。
Validate=None # 是否检查两个merge的DFkeys是一对一关系、一对多关系,返回布尔值( 'one_to_one'/ '1:1', 'one_to_many' / '1:m', 'many_to_one' / 'm:1')。默认情况下3种关系都可以,只是没有输出。
)
例子(注:要防止左右表的merge列同时存在空值,否则空值行的结果是笛卡尔积。例如,右边m个坐标n个空值,则左merge后,结果有n*m的控制行。)
- merge两个DataFrame:
>>> A >>> B
lkey value rkey value
0 foo 1 0 foo 5
1 bar 2 1 bar 6
2 baz 3 2 qux 7
3 foo 4 3 bar 8
>>> A.merge(B, left_on='lkey', right_on='rkey', how='outer')
lkey value_x rkey value_y
0 foo 1 foo 5
1 foo 4 foo 5
2 bar 2 bar 6
3 bar 2 bar 8
4 baz 3 NaN NaN
5 NaN NaN qux 7
- merge多个DataFrame与之类似,直接向后添加:
A.merge(B, right_on='col_r', left_on='col_l', how='outer').merge(C, right_on='col_r1', left_on='col_l1', how='outer')
EXCEL的VLOOKUP()
函数不区分大写小:Python的merge()
函数区分大小写:left.merge(right, left_notallow='agent_name', right_notallow='agent_name1', how='left')
第二、map函数
2)例子部分:
- 数据:
import pandas as pd
data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon', 'Pastrami', 'corned beef', 'Bacon', 'pastrami', 'honey ham', 'nova lox'],
'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
meat_to_animal = {'bacon': 'pig',
'pulled pork': 'pig',
'pastrami': 'cow',
'corned beef': 'cow',
'honey ham': 'pig',
'nova lox': 'salmon'}
print(data)
print(meat_to_animal)
映射关系:
- 要求:
– 在food表中,匹配出food是来源于那种animal的。
data['animal'] = data['food'].str.lower().map(meat_to_animal) # 利用映射表,添加列'animal'
print(data)
注: data['animal'] = data['food'].str.lower().map(meat_to_animal)
1)在“映射关系集合”不完整的情况下也能正常运行,取值NaN。比如这里把 ‘pulled pork’: ‘pig’ 替换成 ‘blabla’: ‘pig’ 。
2)“映射关系集合”完整的情况下,可替换为 data['food'].map(lambda x: meat_to_animal[x.lower()])
。
但它在“映射关系集合”不完整的情况下报错。