اذهب إلى المحتوى

السؤال

نشر (معدل)

لدي إثنان 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

Recommended Posts

  • 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

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...