• 0

كيفية دمج عدة dataframes سوياً في pandas

لدي إثنان dataframes على الشكل التالي بحيث تحتوى الأولى على الأسم والسن وتحتوي الثانية على الأسم أيضا مع جنس الشخص، لكن ليس كل الأشخاص موجودين في كلتا ال dataframes كالتالي:

df1
     Name   Age 
0     Tom    34
1     Sara   18
2     Eva    44
3     Jack   27
4     Laura  30

df2
     Name      Sex 
0     Tom       M
1     Paul      M
2     Eva       F
3     Jack      M
4     Michelle  F

أود أن أقوم بدمجهم سويا مع جعل القيم غير الموجودة ب nan كالتالي:

df1
     Name   Age     Sex
0     Tom    34      M
1     Sara   18     NaN
2     Eva    44      F
3     Jack   27      M
4     Laura  30     NaN

كيف أقوم بهذا؟

 

تمّ تعديل بواسطة Mohamed Elnemr
2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

بشكل مشابه تماماً ل SQL، انظر للمثال التالي:

# Import pandas package
import pandas as pd
data1 = {
    'name':["Tom", "Sara", "Eva","Jack","Laura"],
    'age':[14, 51, 6,88,20] }
df1 = pd.DataFrame(data1)
data2 = {
    'name':["Tom", "Paul", "Eva","Jack","Michelle"],
    'gender':["M", "M","F","M","F"] }
df2 = pd.DataFrame(data2)
# طباعته
print("Original DataFrame1:\n", df1)	
print("Original DataFrame2:\n", df2)	
"""
Original DataFrame1:
     name  age
0    Tom   14
1   Sara   51
2    Eva    6
3   Jack   88
4  Laura   20
Original DataFrame2:
        name gender
0       Tom      M
1      Paul      M
2       Eva      F
3      Jack      M
4  Michelle      F
"""

الآن نريد القيام بعملية دمج. نحن لدينا 4 أنواع من الدمج وهي: Inner Join ويمثل تقاطع الجدولين:

# الدمج الداخلي
# on تمثل العمود الذي نريد الدمج على أساسه
pd.merge(df1,df2, how="inner",on='name')
"""
name 	age 	gender
0 	Tom 	14 	M
1 	Eva 	6 	F
2 	Jack 	88 	M
"""

لاحظ أنه أعطانا تقاطع الجدولين، أي الأسماء الموجودة في كل من الجدولين + التي ليس لها قيم null.
الآن الدمج الخارجي:

# الدمج الخارجي
pd.merge(df1,df2, how="outer",on='name')
"""
    name 	age 	gender
0 	Tom 	14.0 	M
1 	Sara 	51.0 	NaN
2 	Eva 	6.0 	F
3 	Jack 	88.0 	M
4 	Laura 	20.0 	NaN
5 	Paul 	NaN 	M
6 	MichelleNaN 	F
"""

لاحظ أنه قام بدمج العناصر المشتركة وغير المشتركة في الجدولين. على أساس العمود name. (ربما تلائم ماتحتاجه أكثر)
الآن الدمج اليساري (ماتقوم به هو دمج يساري):

# الدمج الخارجي
pd.merge(df1,df2, how="left",on='name')
"""
name 	age 	gender
0 	Tom 	14 	M
1 	Sara 	51 	NaN
2 	Eva 	6 	F
3 	Jack 	88 	M
4 	Laura 	20 	NaN
"""

يقوم هنا بدمج الجدولين على أساس العمود nameالموجود في الجدول اليساري أي df1.
الآن الدمج اليميني:

frames = [df1, df2]
pd.merge(df1,df2, how="right",on='name')
"""
 	name 	age 	gender
0 	Tom 	14.0 	M
1 	Paul 	NaN 	M
2 	Eva 	6.0 	F
3 	Jack 	88.0 	M
4 	Michelle NaN 	F
"""

نفس الفكرة السابقة لكن على أساس العمود name في الجدول اليميني.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يمكنك ببساطة إستخدام map كالتالي:

df1['Sex'] = df1['Name'].map(df2.set_index('Name')['Sex'])
print (df1)
    Name  Age  Sex
0    Tom   34    M
1   Sara   18  NaN
2    Eva   44    F
3   Jack   27    M
4  Laura   30  NaN

كذلك هناك طريقة باستخدام merge واستخدام ال left join بحيث نقوم بدمجهم سويا من اليسار كالتالي:

df = df3.merge(df2[['Name','Sex']], on='Name', how='left')
print (df)
    Name  Age  Sex
0    Tom   34    M
1   Sara   18  NaN
2    Eva   44    F
3   Jack   27    M
4  Laura   30  NaN

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن