pandas_DataFrame_merge数据表格合并最重要的方法-产品经理Python数据分析实战笔记002

python pandas merge

pandas_DataFrame_merge业务场景

pandas_DataFrame_merge: 从数据库、商业分析BI(神策、友盟、growingIO、各大公司自研的Bi)、手动各种捣鼓出来的表格,整理出来了很多数据,但是往往来自不同的服务器、库、不同的表,最简单的在数据处理层把数据整合清晰处理,成为关键。这里离不开一个关键方法,pandas.DataFrame.merge()。今天把关键参数做个笔记。

merge()参数

DataFrame.merge(right, left, 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或者Series
  • right – 参与合并的右侧DataFrame或者Series
  • how – 值为left, right, outer,inner,cross之中的一个,默认为内inner
    • left: 只使用左侧frame中的键,类似SQL中的 left out join,保留键排序
    • right: 只使用右边侧frame中的键,类似SQL中的 right out join,保留键排序
    • outer:使用两边键的并集,类似SQL中的 full outer join,按字典顺序排序
    • inner:使用两边键的交集,类似SQL中的 inner join,保留左边键排序
    • cross:从两侧创建笛卡尔积(cartesian product),保留左边键排序(1.2.0新增)
  • on – 列(名称)连接,必须在左和右DataFrame对象中存在(找到)。
  • left_on – 左侧DataFrame中的列用作键,可以是列名或长度等于DataFrame长度的数组。
  • right_on – 来自右的DataFrame的列作为键,可以是列名或长度等于DataFrame长度的数组。
  • left_index – 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 在具有MultiIndex(分层)的DataFrame的情况下,级别的数量必须与来自右DataFrame的连接键的数量相匹配。
  • right_index – 与右DataFrame的left_index具有相同的用法。
  • sort – 按照字典顺序通过连接键对结果DataFrame进行排序。默认为True,设置为False时,在很多情况下大大提高性能。
  • suffixes:默认值 (“_x”, “_y”)。把指定的后缀分别添加到左侧和右侧重叠的列名中。
df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'],
...                     'value': [1, 2, 3, 5]})
df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'],
...                     'value': [5, 6, 7, 8]})
df1
    lkey value
0   foo      1
1   bar      2
2   baz      3
3   foo      5
df2
    rkey value
0   foo      5
1   bar      6
2   baz      7
3   foo      8
df1.merge(df2, left_on='lkey', right_on='rkey')
  lkey  value_x rkey  value_y
0  foo        1  foo        5
1  foo        1  foo        8
2  foo        5  foo        5
3  foo        5  foo        8
4  bar        2  bar        6
5  baz        3  baz        7

df1.merge(df2, left_on='lkey', right_on='rkey',
...           suffixes=('_left', '_right'))
  lkey  value_left rkey  value_right
0  foo           1  foo            5
1  foo           1  foo            8
2  foo           5  foo            5
3  foo           5  foo            8
4  bar           2  bar            6
5  baz           3  baz            7

关于how相关参数

df1 = pd.DataFrame({'a': ['foo', 'bar'], 'b': [1, 2]})
df2 = pd.DataFrame({'a': ['foo', 'baz'], 'c': [3, 4]})
df1
      a  b
0   foo  1
1   bar  2
df2
      a  c
0   foo  3
1   baz  4
df1.merge(df2, how='inner', on='a')
      a  b  c
0   foo  1  3

df1.merge(df2, how='left', on='a')
      a  b  c
0   foo  1  3.0
1   bar  2  NaN

关于how = 'cross'(pandas 1.2.0新增):从两侧创建笛卡尔积(cartesian product),保留左边键排序。那什么是笛卡尔积(cartesian product),由于没有联结条件的表关系返回的结果为笛卡尔积。检索出的行数是第一个表中的行数乘以第二个表中的行数。一个典型的案例是关于扑克花色。

df1 = pd.DataFrame({'left': ['foo', 'bar']})
df2 = pd.DataFrame({'right': [7, 8]})
df1
    left
0   foo
1   bar
df2
    right
0   7
1   8
df1.merge(df2, how='cross')
   left  right
0   foo      7
1   foo      8
2   bar      7
3   bar      8

关于how=suffixes

left = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'v': [1, 2, 3]})
right = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'v': [4, 5, 6]})
result = pd.merge(left, right, on='k')
result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])

相关阅读

产品经理实战笔记教程(精细化运营、数据驱动、数据分析)
Merge, join, and concatenate
pandas官方文档
笛卡尔积(cartesian product):由于没有联结条件的表关系返回的结果为笛卡尔积。检索出的行数是第一个表中的行数乘以第二个表中的行数。一个典型的案例是关于扑克花色,参见维基百科笛卡尔积

pandas_DataFrame_merge

发表评论

邮箱地址不会被公开。