0

I have 2 data frame, i need to combine like below

This is my Data frame 1

enter image description here

This is my Data frame 2

enter image description here

i want my output as below :

enter image description here

Shiv948
  • 469
  • 5
  • 13

4 Answers4

4
index = pd.MultiIndex.from_product(
    [df1['symbol'], df2['symbol']], 
    names=['col1', 'col2'])

pd.DataFrame(index=index).reset_index()
    col1    col2
0   L160    K-AL
1   L160    K-PL
2   L170    K-AL
3   L170    K-PL
4   L180    K-AL
5   L180    K-PL

Edit:

even better now thanks to @Andy L.:

pd.MultiIndex.from_product([df1['symbol'], df2['symbol']], names=['col1', 'col2']) \
    .to_frame(index=False)
help-ukraine-now
  • 3,850
  • 4
  • 19
  • 36
3

Assign an artificial key column and merge on it to get all the matches:

df1.assign(key=1).merge(df2.assign(key=1), on='key', suffixes=['_1', '_2']).drop('key', axis=1)

Output

  symbol_1 symbol_2
0     L160     K-AL
1     L160     K-PL
2     L170     K-AL
3     L170     K-PL
4     L180     K-AL
5     L180     K-PL
Erfan
  • 40,971
  • 8
  • 66
  • 78
2
df1 = DataFrame({'key':[1,1,1],'symbol':['L160','L170','L180']})
df2 = DataFrame({'key':[1,1],'symbol':['K-PL','K-AL']})
merge(df1, df2,on='key')[['col1', 'col2']]

Basically its a cartesian product. LINK

OUTPUT

  key symbol_x symbol_y
0    1     L160     K-PL
1    1     L160     K-AL
2    1     L170     K-PL
3    1     L170     K-AL
4    1     L180     K-PL
5    1     L180     K-AL

Anshuman Kumar
  • 464
  • 1
  • 6
  • 20
1

Using Numpy can also work:

import numpy as np
import pandas as pd

df1 = pd.DataFrame(['L160', 'L170', 'L180'],columns=['symbol'])
df2 = pd.DataFrame(['K-AL', 'K-PL'],columns=['symbol'])

np.transpose([np.tile(df1['symbol'], len(df2['symbol'])), np.repeat(df2['symbol'], len(df1['symbol']))])

Or directly in a Pandas dataframe:

pd.DataFrame(np.transpose([np.tile(df1['symbol'], len(df2['symbol'])), np.repeat(df2['symbol'], len(df1['symbol']))]))
virgilus
  • 141
  • 1
  • 11