题目:
表:
Person
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ personId 是该表的主键(具有唯一值的列)。 该表包含一些人的 ID 和他们的姓和名的信息。表:
Address
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | +-------------+---------+ addressId 是该表的主键(具有唯一值的列)。 该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。编写解决方案,报告
Person
表中每个人的姓、名、城市和州。如果personId
的地址不在Address
表中,则报告为null
。以 任意顺序 返回结果表。
结果格式如下所示。
来源:力扣(LeetCode)
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
示例:
示例 1:
输入:
Person表: +----------+----------+-----------+ | personId | lastName | firstName | +----------+----------+-----------+ | 1 | Wang | Allen | | 2 | Alice | Bob | +----------+----------+-----------+ Address表: +-----------+----------+---------------+------------+ | addressId | personId | city | state | +-----------+----------+---------------+------------+ | 1 | 2 | New York City | New York | | 2 | 3 | Leetcode | California | +-----------+----------+---------------+------------+输出:
+-----------+----------+---------------+----------+ | firstName | lastName | city | state | +-----------+----------+---------------+----------+ | Allen | Wang | Null | Null | | Bob | Alice | New York City | New York | +-----------+----------+---------------+----------+
解释:地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。 addressId = 1 包含了 personId = 2 的地址信息。
解法:
先根据personId将person表和address表左外连接,接着提取只需要的列。
知识点:
1.pandas.merge(left, right, 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:左表表名;right:右表表名;how:连接方式,有inner,left,right,outer,cross,对应sql中的各个连接方式,默认值为inner;on, left_on, right_on, left_index, right_index:表示两张表需要根据什么值连接就可以写在这边。若两边相连的值具有相同的列名就直接用on,若是列名不同则分别用left_on和right_on分别指定列名,若是需要根据index相连,则通过left_index或者right_index=True指定;sort: 按字典顺序通过连接键对结果DataFrame进行排序,默认为True,设置为False将在很多情况下显着提高性能;suffixes:若是两张表中都有相同列名的字段,他默认是给你用column_x,column_y的方式给你区分开,可以自己定义列名;copy: 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此;indicator:默认False,若是True,则会添加一列"_merge",这一列会标注合并键数据的存在是因为存在在左表(left_only),存在在右表(right_only)还是这个数据两个表都有(both);validate:可以验证合并是否为指定类型:有one_to_one(1:1), one_to_many(1:m), many_to_one(m:1), many_to_many(m:m),若是数据和选择的指定类型不符合,会直接报错。比如:
data = [[1, 'Wang', 'Allen'], [2, 'Alice', 'Bob']] person = pd.DataFrame(data, columns=['personId', 'firstName', 'lastName']).astype( {'personId': 'Int64', 'firstName': 'object', 'lastName': 'object'}) data = [[1, 2, 'New York City', 'New York'], [2, 3, 'Leetcode', 'California']] address = pd.DataFrame(data, columns=['addressId', 'personId', 'city', 'state']).astype( {'addressId': 'Int64', 'personId': 'Int64', 'city': 'object', 'state': 'object'})pd.merge(person, address, how='left', on='personId')左表中所有的数据都会显示:
2.删除pd的列:del dataframe[‘column_name’]。
3.左外连接:显示左边的表的所有数据(不管两表是否匹配),对于不匹配的部分都用NULL显示。
代码:
import pandas as pd def combine_two_tables(person: pd.DataFrame, address: pd.DataFrame) -> pd.DataFrame: m = pd.merge(person, address, how='left', on='personId') del m['addressId'] del m['personId'] return m