การรวม DataFrames แพนด้า 2 ตัวเข้ากับเงื่อนไขบางประการ

ฉันไม่สามารถทราบวิธีการรวม DataFrames แพนด้า 2 ตัวเข้ากับเงื่อนไขบางประการได้

ฉันมีสิ่งนี้:

import pandas as pd

df1 = pd.DataFrame({'Name': ['A', 'A', 'A', 'B' ,'B' ,'B'],
                    'Date': ['10/15/2019', '10/16/2019', '10/17/2019', '10/15/2019', '10/16/2019', '10/17/2019'], 
                    'Value 1': [101, 102, 103, 201, 202, 203],
                    'Value 2': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})

df2 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B' ,'C'],
                    'Date': ['10/14/2019', '10/15/2019', '10/13/2019', '10/18/2019', '10/18/2019'], 
                    'Value 3': [2, 2, 22, 44, 222]})

ฉันจำเป็นต้องได้รับสิ่งนี้

ฉันต้องการรวมเฉพาะชื่อที่มีอยู่ใน df1 แต่เพิ่มวันที่ที่มีอยู่ใน df2 อย่างไรก็ตาม วันที่เหล่านั้นควรมากกว่า 10/13/2019

ที่ใกล้ที่สุดที่ฉันสามารถทำได้คือ

df_m = pd.merge(df1, df2, how='outer', left_on=['Name', 'Date'], right_on=['Name', 'Date'], sort=True)

แต่รวมถึงทุกสิ่ง ('C' จาก df2 - ฉันไม่ต้องการมันและวันที่ 13/10/2019 สำหรับ 'B' - ฉันก็ไม่ต้องการมันเช่นกัน)

ฉันขอขอบคุณความช่วยเหลือใด ๆ

แก้ไขแล้ว: เราสามารถยกเลิกเงื่อนไขของวันที่ที่มากกว่า 10/13/2019 ได้ - ฉันคิดออกโดยเพิ่งสร้าง df2_mod อื่นโดยที่ฉันไม่รวมวันที่ที่ฉันไม่ต้องการ อย่างไรก็ตาม บางวันที่ที่มีอยู่ใน df2_mod ไม่อยู่ใน df1 และฉันต้องรวมเข้ากับค่า 3 อย่างไรก็ตาม ฉันไม่ต้องการชื่อจาก df2 ไปเป็น df1 ที่ไม่มีอยู่ใน df1


person user_unknown    schedule 24.12.2019    source แหล่งที่มา
comment
ข้อกำหนดของคุณไม่ชัดเจน หากคุณรับทุกอย่างจาก df1 และ df2 นั่นคือการรวมภายนอก การรวมภายนอกจะรวมผลลัพธ์ 'C' เสมอ เนื่องจากรวมทุกอย่างจากทั้งสอง dataframes จากนั้น หากคุณสับเซตวันที่ › 10/13/2019 ผลลัพธ์ C จะยังคงอยู่เนื่องจากวันที่สำหรับบันทึกนั้นคือ 10/18 คุณกำลังอธิบายสิ่งที่เป็นไปไม่ได้ หรือคุณต้องเน้นย้ำความต้องการของคุณให้ชัดเจนยิ่งขึ้น   -  person Julian Drago    schedule 24.12.2019
comment
ดังนั้น ฉันต้องปฏิบัติตามเงื่อนไข 2 ประการ: 1. รวมภายนอกแต่ไม่รวมชื่อที่ไม่มีอยู่ใน df1 2. รวมวันที่ทั้งหมดจาก df2 แม้ว่าจะไม่มีอยู่ใน df1 ก็ตาม   -  person user_unknown    schedule 24.12.2019
comment
ฉันอัปเดตคำถามเริ่มต้นของฉันแล้ว ขอบคุณ   -  person user_unknown    schedule 24.12.2019


คำตอบ (1)


นี่คือวิธีแก้ปัญหาหนึ่ง (ฉันไม่กรองวันที่ที่มากกว่า 10/13/2019 ตามที่ระบุไว้ในคำถามที่อัปเดต):

  1. เรากรอง df2 และทิ้ง 'Names' ทั้งหมดที่ไม่มีอยู่ใน df1
  2. ทำการรวมภายนอกด้วย df1 และ df2_filtered ในคอลัมน์ชื่อและวันที่
  3. เรียงลำดับค่าและสร้างดัชนีใหม่

import pandas as pd

df1 = pd.DataFrame({'Name': ['A', 'A', 'A', 'B' ,'B' ,'B'],
                    'Date': ['10/15/2019', '10/16/2019', '10/17/2019', '10/15/2019', '10/16/2019', '10/17/2019'],
                    'Value 1': [101, 102, 103, 201, 202, 203],
                    'Value 2': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})

df2 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B' ,'C'],
                    'Date': ['10/14/2019', '10/15/2019', '10/13/2019', '10/18/2019', '10/18/2019'],
                    'Value 3': [2, 2, 22, 44, 222]})

df2_filtered = df2[df2['Name'].isin(df1['Name'])]       # we want df2 rows with `Names` that exists in df1
print(df1.merge(df2_filtered, on=['Name', 'Date'], how='outer').sort_values(['Name', 'Date']).reset_index(drop=True))

พิมพ์:

  Name        Date  Value 1 Value 2  Value 3
0    A  10/14/2019      NaN     NaN      2.0
1    A  10/15/2019    101.0      A1      2.0
2    A  10/16/2019    102.0      A2      NaN
3    A  10/17/2019    103.0      A3      NaN
4    B  10/13/2019      NaN     NaN     22.0
5    B  10/15/2019    201.0      B1      NaN
6    B  10/16/2019    202.0      B2      NaN
7    B  10/17/2019    203.0      B3      NaN
8    B  10/18/2019      NaN     NaN     44.0
person Andrej Kesely    schedule 24.12.2019
comment
ขอบคุณมาก มันสมเหตุสมผลแล้ว! ฉันโหวตคำตอบแล้ว! สิ่งนี้ช่วยฉันได้มาก! - person user_unknown; 25.12.2019