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

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新增)
- left: 只使用左侧frame中的键,类似SQL中的
- 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):由于没有联结条件的表关系返回的结果为笛卡尔积。检索出的行数是第一个表中的行数乘以第二个表中的行数。一个典型的案例是关于扑克花色,参见维基百科笛卡尔积
