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

السؤال

نشر

لدي بيانات على هيئة اثنان 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...