第一、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 用vlookup函数 python vlookup功能_pandas


Python的

merge()

函数区分大小写:

left.merge(right, left_notallow='agent_name', right_notallow='agent_name1', how='left')

python 用vlookup函数 python vlookup功能_python 用vlookup函数_02


第二、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)

python 用vlookup函数 python vlookup功能_python 用vlookup函数_03


映射关系:

python 用vlookup函数 python vlookup功能_vlookup_04

  • 要求
    – 在food表中,匹配出food是来源于那种animal的。
data['animal'] = data['food'].str.lower().map(meat_to_animal) # 利用映射表,添加列'animal'

print(data)

python 用vlookup函数 python vlookup功能_jion_05


注: 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()])
但它在“映射关系集合”不完整的情况下报错。