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

السؤال

نشر

لدي بيانات على هيئة اثنان dataframes كالتالي:

df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [6, 7, 8, 9, 10]}) 
df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [6, 7, 8]})

df1

  col1  col2
0     1    6
1     2    7
2     3    8
3     4    9
4     5    10

df2

  col1  col2
0     1    6
1     2    7
2     3    8

وأريد  الحصول على الصفوف التي تحتوى قيماً غير مشتركة بين الاثنتين بحيث يكون كالتالي:
 

  col1  col2
3     4    9
4     5    10

كيف يمكنني فعل هذا؟

Recommended Posts

  • 0
نشر

يمكنك استخدام الحل التالي

  • نقوم بحذف العناصر المتشابه من df2
  • ثم نقوم بعمل merge لل df1 مع df2 كما في المثال التالي
df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3], 
                           'col2' : [10, 11, 12, 13, 14, 10]}) 
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
                           'col2' : [10, 11, 12]})

df_all = df1.merge(df2.drop_duplicates(), on=['col1','col2'], 
                   how='left', indicator=True)

الناتج يكون كالتالي

df_all

   col1  col2     _merge
0     1    10       both
1     2    11       both
2     3    12       both
3     4    13  left_only
4     5    14  left_only
5     3    10  left_only

العناصر الغير مشتركة تكون كما في الناتج ليست both

  • 0
نشر

في الواقع هناك طريقيتين سهلتين للحصول على الفرق بين dataframes:

  • الأولى عن طريق جمع الاثنين معا ثم اختيار العناصر التي لا تشتركان فيهم سوياً كالتالي:
In [2]:

common = df1.merge(df2,on=['col1','col2'])
print(common)

   col1  col2
0     1    6
1     2    7
2     3    8

df1[(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))]
Out[2]:
   col1  col2
3     4    9
4     5    10
  • الثانية عن طريق اختيار العناصر التي لا تتواجد في ال dataframe الصغيرة باستخدام الدالة isin كالتالي:
In [3]:

df1[~df1.isin(df2)].dropna()
Out[3]:
   col1  col2
3     4    9
4     5    10

لاحظ استخدام العلامة ~ والتي تعني not او النفي، وهنا تعني "غير متواجد" أي تختار العناصر من df1 غير المتواجدة في df2

  • 0
نشر (معدل)

حلول أخرى:

import pandas as pd
df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3], 
                           'col2' : [10, 11, 12, 13, 14, 10]}) 
"""
    col1 	col2
0 	1 	10
1 	2 	11
2 	3 	12
3 	4 	13
4 	5 	14
5 	3 	10
"""
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
                           'col2' : [10, 11, 12]})
df2
"""
    col1 	col2
0 	1 	10
1 	2 	11
2 	3 	12
"""
# الطريقة 1
# نحدد الأسطر الغير مشتركة
uncommon_indices = np.setdiff1d(df1.index.values, df2.index.values)
# array([3, 4, 5])
# نقوم باستخلاصها
df1.loc[uncommon_indices,:]
"""
  	col1 	col2
3 	4 	13
4 	5 	14
5 	3 	10
"""
# الطريقة 2
df1[~df1.index.isin(df1.merge(df2, how='inner', on=['col1', 'col2']).index)]
"""
col1 	col2
3 	4 	13
4 	5 	14
5 	3 	10
"""
# الشرح خطوة بخطوة
# تطبيق الدمج الداخلي للحصول على العناصر المشتركة بين إطاري البيانات
res1=df1.merge(df2, how='inner', on=['col1', 'col2'])
res1
"""
col1 	col2
0 	1 	10
1 	2 	11
2 	3 	12
"""
#في الأماكن التي لاتتواجد فيها False في أماكن تواجد هذه الفهارس و True بحيث تضع  isin استخدام الدالة 
#في الأسطر غير المشتركة True ثم استخدام عملية النفي ليتم وضع 
res2=~df1.index.isin(res1.index)
res2
# array([False, False, False,  True,  True,  True])
# الآن نستخلصها
df1[res2]
"""
  col1 	col2
3 	4 	13
4 	5 	14
5 	3 	10
"""
# الطريقة 3
df = pd.merge(df1, df2, how='outer', suffixes=('','_y'), indicator=True)
df[df['_merge']=='left_only'][df1.columns]
"""
col1 	col2
3 	4 	13
4 	5 	14
5 	3 	10
"""

 

تم التعديل في بواسطة Ali Haidar Ahmad

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...