Python: объединение наборов данных на основе комбинаций первичных ключей

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

Мне нужно объединить три фрейма данных на основе первичных ключей и оставить пустые значения как есть. Вот как выглядят мои фреймы данных,

 df1
col1 col2 cola colb
123  abc  JNT  80
123  abc  MTN  82
124  de   KTU  90

df2
col1 col2 colc  cold
123  abc  testa vala
124  de   test2 val2
124  de  test3 val3

df3
col1 col2 cole
123  abc  data1
  

Это логика, которую я пробовал.

 import pandas as pd

df1=pd.DataFrame(data={'col1':[123,123,124],'col2':['abc','abc','de'],'cola':['JNT','MTN','KTU'],'colb':[80,82,90]})
df2=pd.DataFrame(data={'col1':[123,124,124],'col2':['abc','de','de'],'colc':['testa','test2','test3'],'cold':['vala','val2','val3']})
df3=pd.DataFrame(data={'col1':[123],'col2':['abc'],'cole':['data1']})
cols=['col1','col2']
df=[df1,df2,df3]
df_final=pd.DataFrame()
for f in range(len(df)):    
    df[f]=df[f].set_index(cols)
df_final=pd.concat([df1,df2,df3],axis=1)
print (df_final)

   col1 col2 cola  colb  col1 col2   colc  cold   col1 col2   cole
0   123  abc  JNT    80   123  abc  testa  vala  123.0  abc  data1
1   123  abc  MTN    82   124   de  test2  val2    NaN  NaN    NaN
2   124   de  KTU    90   124   de  test3  val3    NaN  NaN    NaN
  

Но мне нужен конечный результат, подобный этому

 col1  col2  cola  colb  colc  cold  cole
123   abc   JNT   80    testa vala  data1
123   abc   MTN   82
124   de                test2  val2
124   de                test3  val3
  

Может кто-нибудь, пожалуйста, помочь мне.
Заранее спасибо!!!

Комментарии:

1. Если вы новичок — обратитесь к этому документу, в котором показаны все типы объединений в python. datacarpentry.org/python-ecology-lesson/05-merging-data

Ответ №1:

Как я уже сказал, вам нужно cumcount создать справочный ключ

 cols = ['col1','col2']
df1['help'] = df1.groupby(cols).cumcount()
df2['help'] = df2.groupby(cols).cumcount()
df3['help'] = df3.groupby(cols).cumcount()

out = pd.concat(([x.set_index(cols ['help'])for x in [df1,df2,df3]]),axis=1).reset_index(level=[0,1])
out
Out[13]: 
      col1 col2 cola  colb   colc  cold   cole
help                                          
0      123  abc  JNT  80.0  testa  vala  data1
1      123  abc  MTN  82.0    NaN   NaN    NaN
0      124   de  KTU  90.0  test2  val2    NaN
1      124   de  NaN   NaN  test3  val3    NaN
  

Комментарии:

1. BEN !!! какую бы логику вы ни использовали, я включил ее в свой код. Но это не работает

2. Вот как выглядят мои наборы данных: первый набор данных: 4 строки, второй набор данных: 10 строк, третий набор данных: 6 строк. Все три набора данных имеют комбинацию из 7 столбцов первичных ключей. На самом деле в итоге должно быть только максимальное количество строк набора данных, равное 10. Но я мог видеть 20 строк.

3. @Jennie Что вы имеете в виду, можете ли вы показать более подробно, я думаю, что ваш образец данных решает реальную проблему, которая у вас есть