Educoder python Pandas数据预处理 第1关:合并数据

题目链接: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

 
  1. left = pd.DataFrame({
  2. 'id':[1,2,3,4,5],
  3. 'Name': ['Alex', 'Amy', 'Alice', 'Alice', 'Ayoung'],
  4. 'subject_id':['sub1','sub2','sub4','sub6','sub5']})
  5. right = pd.DataFrame({
  6. 'id':[1,2,3,4,5],
  7. 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
  8. 'subject_id':['sub2','sub4','sub3','sub6','sub5']})
  9.  
  10. pd.merge(left,right,on="id")
  11. pd.merge(left,right,on=["id","subject_id"])

输出:

 
  1. id Name_x subject_id_x Name_y subject_id_y
  2. 0 1 Alex sub1 Billy sub2
  3. 1 2 Amy sub2 Brian sub4
  4. 2 3 Alice sub4 Bran sub3
  5. 3 4 Alice sub6 Bryce sub6
  6. 4 5 Ayoung sub5 Betty sub5
  7. ---------------------------------------------
  8. id Name_x subject_id Name_y
  9. 0 4 Alice sub6 Bryce
  10. 1 5 Ayoung sub5 Betty

使用“how”参数

如何合并参数指定如何确定哪些键将被包含在结果表中。如果组合键没有出现在左侧或右侧表中,则连接表中的值将为NA

 
  1. left = pd.DataFrame({
  2. 'id':[1,2,3,4,5],
  3. 'Name': ['Alex', 'Amy', 'Alice', 'Alice', 'Ayoung'],
  4. 'subject_id':['sub1','sub2','sub4','sub6','sub5']})
  5. right = pd.DataFrame({
  6. 'id':[1,2,3,4,5],
  7. 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
  8. 'subject_id':['sub2','sub4','sub3','sub6','sub5']})
  9.  
  10. pd.merge(left, right, on="subject_id", how="left")

输出:

 
  1. id_x Name_x subject_id id_y Name_y
  2. 0 1 Alex sub1 NaN NaN
  3. 1 2 Amy sub2 1.0 Billy
  4. 2 3 Alice sub4 2.0 Brian
  5. 3 4 Alice sub6 4.0 Bryce
  6. 4 5 Ayoung sub5 5.0 Betty
 
  1. pd.merge(left, right, on='subject_id', how='right')

输出:

 
  1. id_x Name_x subject_id id_y Name_y
  2. 0 2.0 Amy sub2 1 Billy
  3. 1 3.0 Alice sub4 2 Brian
  4. 2 4.0 Alice sub6 4 Bryce
  5. 3 5.0 Ayoung sub5 5 Betty
  6. 4 NaN NaN sub3 3 Bran
 
  1. pd.merge(left, right, on="subject_id", how="outer")

输出:

 
  1. id_x Name_x subject_id id_y Name_y
  2. 0 1.0 Alex sub1 NaN NaN
  3. 1 2.0 Amy sub2 1.0 Billy
  4. 2 3.0 Alice sub4 2.0 Brian
  5. 3 4.0 Alice sub6 4.0 Bryce
  6. 4 5.0 Ayoung sub5 5.0 Betty
  7. 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 不保留连接轴上的索引,产生一组新索引

纵向合并

 
  1. left = pd.DataFrame({
  2. 'id':[1,2,3,4,5],
  3. 'Name': ['Alex', 'Amy', 'Alice', 'Alice', 'Ayoung'],
  4. 'subject_id':['sub1','sub2','sub4','sub6','sub5']})
  5. right = pd.DataFrame({
  6. 'id':[1,2,3,4,5,6],
  7. 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty','Judy'],
  8. 'subject_id':['sub2','sub4','sub3','sub6','sub5','sub6']})
  9.  
  10. pd.concat([left,right], ignore_index=True) #忽略原index,重新生成index

输出:

 
  1. id Name subject_id
  2. 0 1 Alex sub1
  3. 1 2 Amy sub2
  4. 2 3 Alice sub4
  5. 3 4 Alice sub6
  6. 4 5 Ayoung sub5
  7. 5 1 Billy sub2
  8. 6 2 Brian sub4
  9. 7 3 Bran sub3
  10. 8 4 Bryce sub6
  11. 9 5 Betty sub5
  12. 10 6 Judy sub6

横向合并

 
  1. pd.concat([left,right],axis=1,join="inner",keys=["a","b"])

输出:

 
  1. a b
  2. id Name subject_id id Name subject_id
  3. 0 1 Alex sub1 1 Billy sub2
  4. 1 2 Amy sub2 2 Brian sub4
  5. 2 3 Alice sub4 3 Bran sub3
  6. 3 4 Alice sub6 4 Bryce sub6
  7. 4 5 Ayoung sub5 5 Betty sub5

combine_first()

combine_first()是用于合并重叠数据的函数,类似于numpy中的where

 
  1. left = pd.DataFrame({
  2. 'id':[1,2,3,4,5],
  3. 'Name': ['Alex', 'Amy', 'Alice', 'Alice', 'Ayoung'],
  4. 'subject_id':['sub1','sub2','sub4','sub6','sub5']})
  5. right = pd.DataFrame({
  6. 'id':[1,2,3,4,5,6],
  7. 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty','Judy'],
  8. 'subject_id':['sub2','sub4','sub3','sub6','sub5','sub6']})
  9.  
  10. left.combine_first(right) #left中没有的数据就用right中的

输出:

 
  1. id Name subject_id
  2. 0 1.0 Alex sub1
  3. 1 2.0 Amy sub2
  4. 2 3.0 Alice sub4
  5. 3 4.0 Alice sub6
  6. 4 5.0 Ayoung sub5
  7. 5 6.0 Judy sub6

编程要求

根据提示,在右侧编辑器补充代码,并完成以下三个任务:

  • 使用左侧表中的subject_id键连接raw_data_1raw_data_2
  • 以交集的方式横向连接raw_data_1raw_data_3
  • 重叠合并raw_data_1raw_data_2两个DataFrame

测试说明

平台会对你编写的代码进行测试:

测试输入:无

预期输出:

 
  1. subject_id first_name_x last_name_x first_name_y last_name_y
  2. 0 1 Alex Anderson NaN NaN
  3. 1 2 Amy Ackerman NaN NaN
  4. 2 3 Allen Ali NaN NaN
  5. 3 4 NaN Aoni Billy Bonder
  6. 4 5 NaN Atiches Brian Black
  7. ----------------------------------------------------------
  8. subject_id first_name last_name subject_id test_id
  9. 0 1 Alex Anderson 1 51
  10. 1 2 Amy Ackerman 2 15
  11. 2 3 Allen Ali 3 15
  12. 3 4 NaN Aoni 4 61
  13. 4 5 NaN Atiches 5 16
  14. ----------------------------------------------------------
  15. subject_id first_name last_name
  16. 0 1 Alex Anderson
  17. 1 2 Amy Ackerman
  18. 2 3 Allen Ali
  19. 3 4 Bryce Aoni
  20. 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()




你可能感兴趣的:(Educoder编程题答案解析)