请思考:
1 SQL的表连接有哪些方式?如何使用?
2 pandas的merge()函数如何实现左连接(left_join)?
我创建了Python语言微信群,定位:Python语言学习和实践。想要入群的伙伴,请加我的个人微信:luqin360,备注:Python入群。
一 SQL的表连接方式
一图胜千字,SQL表连接方式,如下图总结:
我在实际工作中,常用的连接方式:内连接(inner_join),左连接(left_join)和A-B连接。
请您花30秒时间,给自己复述下上图的7种连接的处理逻辑?
二 pandas的merge()函数实现类SQL的连接
pandas提供merge()函数可以便捷地实现类似SQL的各种连接操作。
>merge函数说明文档:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html
重要参数:
三 实践操练
1 导入所需库和数据集
代码
# 导入所需库
import pandas as pd
# 导入数据集
user_usage = pd.read_csv('./data/user_usage.csv')
user_device = pd.read_csv('./data/user_device.csv')
devices = pd.read_csv('./data/android_devices.csv')
# 对devices的列名重命名
devices.rename(columns={"Retail Branding": "manufacturer"}, inplace=True)
# 数据检视
print(user_usage.head())
print(user_device.head())
print(devices.head())
2 内连接(默认的连接方式)
代码
result = pd.merge(user_usage, user_device[['use_id', 'platform', 'device']], on='use_id')
result.head()
3 左连接(how='left')
代码
result = pd.merge(user_usage,
user_device[['use_id', 'platform', 'device']],
how = 'left',
on = 'use_id')
print('user_usage 维度:{}'.format(user_usage.shape))
print('result 维度:{}'.format(result.shape))
print('result 的缺失值个数:{}'.format(result['device'].isnull().sum()))
print(result.head())
4 右连接(how='right')
代码
result = pd.merge(user_usage,
user_device[['use_id', 'platform', 'device']],
on = 'use_id',
how = 'right')
print('user_device 维度:{}'.format(user_device.shape))
print('result 维度:{}'.format(result.shape))
print('result中列名monthly_mb的缺失值个数:{}'.format(result['monthly_mb'].isnull().sum()))
print(result.tail())
5 差连接
代码
result = pd.merge(user_usage,
user_device[['use_id', 'platform', 'device']],
how = 'left',
on = 'use_id')
result1 = result[result['device'].isnull()]
print('result 维度:{}'.format(result.shape))
print('result1 维度:{}'.format(result1.shape))
print(result1.head())
6 全连接(how='outer')
代码
print('两个数据框全连接后use_id的唯一值个数:{}'.format(pd.concat([user_usage['use_id'], user_device['use_id']]).unique().shape[0]))
result = pd.merge(user_usage,
user_device[['use_id', 'platform', 'device']],
how = 'outer',
on = 'use_id',
indicator = True)
print('全连接结果所具有的函数:{}'.format(result.shape[0]))
print('全连接结果没有缺失值的行数:{}'.format((result.apply(lambda x: x.isnull().sum(), axis=1) == 0).sum()))
print(result.iloc[[0, 1, 200,201, 350,351]])