题目链接:https://www.educoder.net/tasks/lpgo28jbnc74
- 任务描述
- 相关知识
- merge()
- 在一个或多个键上合并两个DataFrame
- 使用“how”参数
- concat()
- 纵向合并
- 横向合并
- combine_first()
- 编程要求
- 测试说明
任务描述
本关任务:按编程要求合并右侧代码中的数据。
相关知识
Pandas
提供了一套合并数据集操作的方法,本实训主要介绍merge()
、concat()
和combine_first()
实现。merge()
merge()
可根据一个或者多个键将不同的DataFrame
连接在一起,类似于SQL
数据库中的合并操作。
参数名 说明 left 拼接左侧DataFrame对象 right 拼接右侧DataFrame对象 on 列(名称)连接,必须在左和右DataFrame对象中存在(找到)。 left_on 左侧DataFrame中的列或索引级别用作键,可以是列名、索引级名,也可以是长度等于DataFrame长度的数组。 right_on 右侧DataFrame中的列或索引级别用作键。可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。 left_index 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 right_index 与left_index相似 how 它可以等于’left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集。 sort sort - 按照字典顺序通过连接键对结果DataFrame进行排序。 suffixes 用于追加到重叠列名的末尾。例如,左右两个DataFrame都有‘data’列,则结果中就会出现‘data_x’和‘data_y’. copy 默认总是复制 在一个或多个键上合并两个DataFrame
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Alice', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
pd.merge(left,right,on="id")
pd.merge(left,right,on=["id","subject_id"])
输出:
id Name_x subject_id_x Name_y subject_id_y
0 1 Alex sub1 Billy sub2
1 2 Amy sub2 Brian sub4
2 3 Alice sub4 Bran sub3
3 4 Alice sub6 Bryce sub6
4 5 Ayoung sub5 Betty sub5
---------------------------------------------
id Name_x subject_id Name_y
0 4 Alice sub6 Bryce
1 5 Ayoung sub5 Betty
使用“how”参数
如何合并参数指定如何确定哪些键将被包含在结果表中。如果组合键没有出现在左侧或右侧表中,则连接表中的值将为
NA
。
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Alice', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
pd.merge(left, right, on="subject_id", how="left")
输出:
id_x Name_x subject_id id_y Name_y
0 1 Alex sub1 NaN NaN
1 2 Amy sub2 1.0 Billy
2 3 Alice sub4 2.0 Brian
3 4 Alice sub6 4.0 Bryce
4 5 Ayoung sub5 5.0 Betty
pd.merge(left, right, on='subject_id', how='right')
输出:
id_x Name_x subject_id id_y Name_y
0 2.0 Amy sub2 1 Billy
1 3.0 Alice sub4 2 Brian
2 4.0 Alice sub6 4 Bryce
3 5.0 Ayoung sub5 5 Betty
4 NaN NaN sub3 3 Bran
pd.merge(left, right, on="subject_id", how="outer")
输出:
id_x Name_x subject_id id_y Name_y
0 1.0 Alex sub1 NaN NaN
1 2.0 Amy sub2 1.0 Billy
2 3.0 Alice sub4 2.0 Brian
3 4.0 Alice sub6 4.0 Bryce
4 5.0 Ayoung sub5 5.0 Betty
5 NaN NaN sub3 3.0 Bran
concat()
concat()
函数可以沿某个轴将多个数据集连接在一起。
参数名 说明 objs 参与连接的对象,必要参数 axis 指定轴,默认为0 join ‘inner’或者‘outer’,默认为‘outer’,指明其他轴的索引按哪种方式进行合并,inner表示取交集,outer表示取并集 join_axes 指明用于其他n-1条轴的索引,不执行并集/交集运算 keys 与连接对象有关的值,用于形成连接轴向上的层次化索引。可以是任意值的列表或数组 levels 指定用作层次化索引各级别上的索引 names 用于创建分层级别的名称,如果设置了keys和levels verify_integrity 检查结果对象新轴上的重复情况,如果发现则引发异常。默认False允许重复 ignore_index 不保留连接轴上的索引,产生一组新索引 纵向合并
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Alice', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5,6],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty','Judy'],
'subject_id':['sub2','sub4','sub3','sub6','sub5','sub6']})
pd.concat([left,right], ignore_index=True) #忽略原index,重新生成index
输出:
id Name subject_id
0 1 Alex sub1
1 2 Amy sub2
2 3 Alice sub4
3 4 Alice sub6
4 5 Ayoung sub5
5 1 Billy sub2
6 2 Brian sub4
7 3 Bran sub3
8 4 Bryce sub6
9 5 Betty sub5
10 6 Judy sub6
横向合并
pd.concat([left,right],axis=1,join="inner",keys=["a","b"])
输出:
a b
id Name subject_id id Name subject_id
0 1 Alex sub1 1 Billy sub2
1 2 Amy sub2 2 Brian sub4
2 3 Alice sub4 3 Bran sub3
3 4 Alice sub6 4 Bryce sub6
4 5 Ayoung sub5 5 Betty sub5
combine_first()
combine_first()
是用于合并重叠数据的函数,类似于numpy
中的where
。
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Alice', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5,6],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty','Judy'],
'subject_id':['sub2','sub4','sub3','sub6','sub5','sub6']})
left.combine_first(right) #left中没有的数据就用right中的
输出:
id Name subject_id
0 1.0 Alex sub1
1 2.0 Amy sub2
2 3.0 Alice sub4
3 4.0 Alice sub6
4 5.0 Ayoung sub5
5 6.0 Judy sub6
编程要求
根据提示,在右侧编辑器补充代码,并完成以下三个任务:
- 使用左侧表中的
subject_id
键连接raw_data_1
和raw_data_2
;- 以交集的方式横向连接
raw_data_1
和raw_data_3
;- 重叠合并
raw_data_1
和raw_data_2
两个DataFrame
。测试说明
平台会对你编写的代码进行测试:
测试输入:无
预期输出:
subject_id first_name_x last_name_x first_name_y last_name_y
0 1 Alex Anderson NaN NaN
1 2 Amy Ackerman NaN NaN
2 3 Allen Ali NaN NaN
3 4 NaN Aoni Billy Bonder
4 5 NaN Atiches Brian Black
----------------------------------------------------------
subject_id first_name last_name subject_id test_id
0 1 Alex Anderson 1 51
1 2 Amy Ackerman 2 15
2 3 Allen Ali 3 15
3 4 NaN Aoni 4 61
4 5 NaN Atiches 5 16
----------------------------------------------------------
subject_id first_name last_name
0 1 Alex Anderson
1 2 Amy Ackerman
2 3 Allen Ali
3 4 Bryce Aoni
4 5 Betty Atiches
开始你的任务吧,祝你成功!
import pandas as pd
import numpy as np
def data_merge():
raw_data_1 = pd.DataFrame({
"subject_id": ["1", "2", "3", "4", "5"],
"first_name": ["Alex", "Amy", "Allen", np.nan, np.nan],
"last_name": ["Anderson", "Ackerman", "Ali", "Aoni", "Atiches"]})
raw_data_2 = pd.DataFrame({
"subject_id": ["4", "5", "6", "7", "8"],
"first_name": ["Billy", "Brian", "Bran", "Bryce", "Betty"],
"last_name": ["Bonder", "Black", "Balwner", "Brice", "Btisan"]})
raw_data_3 = pd.DataFrame({
"subject_id": ["1", "2", "3", "4", "5", "7", "8", "9", "10", "11"],
"test_id": [51, 15, 15, 61, 16, 14, 15, 1, 61, 16]})
#********** Begin *********#
print(pd.merge(raw_data_1,raw_data_2,on=["subject_id"],how='left'))
print(pd.concat([raw_data_1,raw_data_3],axis=1,join="inner"))
print(raw_data_1.combine_first(raw_data_2))
#********** End **********#
if __name__ == '__main__':
data_merge()