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

ضرب متجهات Cartesian product في pandas

Mohamed Elnemr

السؤال

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

from pandas import DataFrame
df1 = DataFrame({'col1':[a,b],'col2':[c,d]})
df2 = DataFrame({'col3':[e,f]}) 

أريد ضرب كلا ال dataframes بحيث يكون على الخرج على هذا الشكل:

   col1  col2  col3
0     a     c     e
1     a     c     f
2     b     d     e
3     b     d     f

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

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

Recommended Posts

  • 0

يمكنك القيام بذلك من خلال الدالة merge لكن في البداية يجب أن تضيف مفتاح لكي تتم عملية الدمج عليه كالتالي:

df1['key'] = 0
df2['key'] = 0
df1.merge(df2, how='left',on = 'key').drop(columns=['key'])
"""
	col1 	col2 	col3
0 	1 	3 	5
1 	1 	3 	6
2 	2 	4 	5
3 	2 	4 	6
"""
df1['key'] = 0
df2['key'] = 0
df1.merge(df2, how='left',on = 'key').drop(columns=['key'])
"""
col1 	col2 	col3
0 	1 	3 	5
1 	1 	3 	6
2 	2 	4 	5
3 	2 	4 	6
"""
# أو
df1.merge(df2, how='outer').drop(columns=['key']) # حسبما تريد
# لكن بالضرورة يجب أن تضيف مفتاح

أو من خلال التابع التالي:

import pandas as pd
def cartesian(df1, df2):
    key = 'key'
    while key in df1.columns or key in df2.columns:
        key = '_' + key
    key_d = {key: 0}
    return pd.merge(df1.assign(**key_d), df2.assign(**key_d), on=key).drop(key, axis=1)
cartesian(df1, df2)
"""
col1 	col2 	col3
0 	1 	3 	5
1 	1 	3 	6
2 	2 	4 	5
3 	2 	4 	6
"""

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في pandas النسخة بداية من 1.2 أو أحدث، يمكنك استخدام الدالة merge مباشرة حيث توفر تلك الخاصية كالتالي:

from pandas import DataFrame
df1 = DataFrame({'col1':[a,b],'col2':[c,d]})
df2 = DataFrame({'col3':[e,f]})    

df1.merge(df2, how='cross')

أما في النسخ الأقدم فيجب تعريف الضرب بشكل خاص كما نفعل في الضرب في SQL بحيث نقوم بعملية الضرب على المفتاح key الذي يجب أن يكون متشابها بين الأعمدة كالتالي:

from pandas import DataFrame, merge
df1 = DataFrame({'key':[1,1], 'col1':[a,b],'col2':[c,d]})
df2 = DataFrame({'key':[1,1], 'col3':[e,f]})

merge(df1, df2,on='key')[['col1', 'col2', 'col3']]

وفي الحالتين يكون الخرج كالتالي:

  col1  col2  col3
0     a     c     e
1     a     c     f
2     b     d     e
3     b     d     f

 

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

  • 0

يمكنك استخدام التابع pd.MultiIndex.from_product ك index في dataframe جديد ثم عمل   reset لل index كما في المثال التالي

a = [1, 2, 3]
b = ["a", "b", "c"]

index = pd.MultiIndex.from_product([a, b], names = ["a", "b"])

pd.DataFrame(index = index).reset_index()

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

   a  b
0  1  a
1  1  b
2  1  c
3  2  a
4  2  b
5  2  c
6  3  a
7  3  b
8  3  c

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...