Python Pandas ผสานเฉพาะบางคอลัมน์


110

เป็นไปได้ไหมที่จะรวมบางคอลัมน์เท่านั้น ฉันมี DataFrame df1 ที่มีคอลัมน์ x, y, z และ df2 ที่มีคอลัมน์ x, a, b, c, d, e, f ฯลฯ

ฉันต้องการผสานสอง DataFrames บน x แต่ฉันต้องการผสานคอลัมน์ df2.a, df2.b เท่านั้นไม่ใช่ทั้ง DataFrame

ผลลัพธ์จะเป็น DataFrame ที่มี x, y, z, a, b

ฉันสามารถผสานแล้วลบคอลัมน์ที่ไม่ต้องการได้ แต่ดูเหมือนว่าจะมีวิธีที่ดีกว่านี้


1
แอนดี้: วัวศักดิ์สิทธิ์มันง่ายมาก ... ฉันต้องการพักและเห็นได้ชัดว่ามันซับซ้อนเกินไป ขอบคุณสำหรับความชัดเจน!
BubbleGuppies

คำตอบ:


81

คุณสามารถรวม DataFrame ย่อย (โดยมีเฉพาะคอลัมน์เหล่านั้น):

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])

6
อืมฉันสงสัยว่าควรมีวิธีดั้งเดิมในการทำเช่นนี้หรือไม่เช่นส่วนย่อยใน dropna ... จะรวบรวมปัญหา github
Andy Hayden

อืม ... ฉันพยายามใช้สิ่งนี้เพื่อรวมคอลัมน์ 'Unique_External_Users' จาก df2 เป็น df1 แต่พบข้อผิดพลาด ... "ไม่มี [ดัชนี (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'object')] อยู่ใน [คอลัมน์] "
CoolDocMan

นี่คือรหัส ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan

1
@CoolDocMan ฉันคิดว่าคุณพลาดอะไรบางอย่างจากคำตอบที่นำเสนอ: list('xab')ใช้เวลาแต่ละองค์ประกอบ (ตัวอักษร) ของสตริง 'xab และแปลงให้เป็นองค์ประกอบรายการเพื่อให้ผลตอบแทนlist('xab') ['x', 'a', 'b']จะได้ผลถ้าแต่ละคอลัมน์มีตัวอักษรเดียวเป็นชื่อ ในกรณีของคุณฉันคิดว่าคุณต้องทำ df1.merge (df2 ['Unique_External_Users'], * other_arguments) ... ส่วนใหญ่แล้วคุณคงแก้ไขไปแล้วเหลือแค่นี้สำหรับมือใหม่เช่นฉัน
SOf_PUAR

114

คุณต้องการใช้สองวงเล็บดังนั้นหากคุณกำลังดำเนินการประเภท VLOOKUP:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

สิ่งนี้จะให้ทุกอย่างใน df เดิมแก่คุณเพิ่มคอลัมน์ที่เกี่ยวข้องใน df2 ที่คุณต้องการเข้าร่วม


12

หากคุณต้องการวางคอลัมน์จากกรอบข้อมูลเป้าหมาย แต่จำเป็นต้องมีคอลัมน์สำหรับการรวมคุณสามารถดำเนินการดังต่อไปนี้:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop('key1')

.drop('key1')ส่วนหนึ่งจะป้องกันไม่ให้ 'key1' จากการถูกเก็บไว้ในกรอบข้อมูลที่เกิดขึ้นแม้ว่ามันจะถูกต้องที่จะเข้าร่วมในสถานที่แรก


5
ฉันได้รับข้อผิดพลาดต่อไปนี้ถ้าฉันลองทำสิ่งนี้:KeyError: "['key1'] not found in axis"
Tanya Branagan

3
ลอง. drop (คอลัมน์ = ['key1'])
psangam

หรือ. drop ('key1', axis = 1)
tonneofash

8

คุณสามารถใช้.locเพื่อเลือกคอลัมน์เฉพาะที่มีแถวทั้งหมดแล้วดึงข้อมูลนั้น ตัวอย่างอยู่ด้านล่าง:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

ในตัวอย่างนี้คุณกำลังรวม dataframe1 และ dataframe2 คุณได้เลือกที่จะทำการรวมด้านซ้ายบน 'คีย์' อย่างไรก็ตามสำหรับ dataframe2 คุณได้ระบุไว้.ilocซึ่งช่วยให้คุณสามารถระบุแถวและคอลัมน์ที่คุณต้องการในรูปแบบตัวเลขได้ ใช้:เพื่อเลือกแถวทั้งหมด แต่[0:5]เลือก 5 คอลัมน์แรก คุณสามารถใช้.locเพื่อระบุชื่อ แต่ถ้าคุณจัดการกับชื่อคอลัมน์แบบยาว.ilocอาจจะดีกว่า


1
ระวังว่า.locจะทำสำเนาและใน df ขนาดใหญ่ที่อาจทำให้เจ็บปวดได้ อาจเป็นการดีกว่าที่จะผสานจากนั้นใช้ชิ้นส่วนคอลัมน์ในนิพจน์เดียวกันทันที
smci

7

นี่คือการรวมคอลัมน์ที่เลือกจากสองตาราง

หากtable_1มีt1_a,t1_b,t1_c..,id,..t1_zคอลัมน์และtable_2มีt2_a, t2_b, t2_c..., id,..t2_zคอลัมน์และต้องใช้เฉพาะ t1_a, id, t2_a ในตารางสุดท้าย

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.