Concat por linha com dataframes de amostra 2

Oct 20 2020

Eu tenho 2 dataframes,

df1
      col1    col2   col3
    0  ABC  XYZ123  RA100
    1  DEF  YHG753  RA200
    2  ABC  XYZ123  RA100
    3  DEF  YHG753  RA200
    4  ABC  XYZ123  RA100
    5  DEF  YHG753  RA200

df2
      col5 col6
    0  TU1  DUM1
    1  TU2  DUM2
    2  TU3  DUM3

Estou tentando conciliar cada linha de df1com uma linha selecionada aleatoriamente dedf2 .

Tenho tentado pd.concat(frames, axis=1), mas concatnão funcionará comigo porque shapeos dataframes não estão combinando. Portanto, estou me perguntando se há uma maneira melhor de fazer isso em vez de aumentar as linhas de df2para corresponder às de df1, então faça concat.

Referência: concate aleatoriamente frames de dados por linha

Saída de amostra esperada:

  col1    col2   col3  col5 col6 
0  ABC  XYZ123  RA100  TU3  DUM3
1  DEF  YHG753  RA200  TU1  DUM1
2  ABC  XYZ123  RA100  TU2  DUM2
3  DEF  YHG753  RA200  TU2  DUM2
4  ABC  XYZ123  RA100  TU3  DUM3
5  DEF  YHG753  RA200  TU1  DUM1

Respostas

3 jezrael Oct 20 2020 at 18:53

A primeira ideia é criar uma coluna auxiliar com valor de índice de atribuição aleatório df2.indexe, em seguida, usar DataFrame.join:

#for test
np.random.seed(2002)

df = (df1.assign(id=np.random.choice(df2.index, size=len(df1)))
         .join(df2, on='id')
         .drop('id', axis=1))
print (df)
  col1    col2   col3 col5  col6
0  ABC  XYZ123  RA100  TU2  DUM2
1  DEF  YHG753  RA200  TU3  DUM3
2  ABC  XYZ123  RA100  TU1  DUM1
3  DEF  YHG753  RA200  TU2  DUM2
4  ABC  XYZ123  RA100  TU1  DUM1
5  DEF  YHG753  RA200  TU1  DUM1

Outra ideia é mesclar por matriz numpy em DataFrame.merge:

np.random.seed(2002)

idx = np.random.choice(df2.index, size=len(df1))
         
df = df1.merge(df2, left_on=idx, right_index=True).drop('key_0', axis=1)
print (df)
  col1    col2   col3 col5  col6
0  ABC  XYZ123  RA100  TU2  DUM2
3  DEF  YHG753  RA200  TU2  DUM2
1  DEF  YHG753  RA200  TU3  DUM3
2  ABC  XYZ123  RA100  TU1  DUM1
4  ABC  XYZ123  RA100  TU1  DUM1
5  DEF  YHG753  RA200  TU1  DUM1