объединить два кадра данных с новым номером индекса

1

как я могу добавить два фрейма данных pandas с другим и добавить изменение индекса, как показано в следующем примере. df1:

     A    B    C    D
1    1    2    3    2
2    2    2    3    1
3    2    3    2    1

df2:

     A    B    C    D
1    1    2    3    2
2    4    2    19   1
3    2    64   2    1

результат должен быть

df_sum:

     A    B    C    D    A_2    B_2    C_2    D_2
1    1    2    3    2    1       2       3     2
2    4    2    19   1    4       2       19    1
2    2    2    3    1    2      64       2     1

а затем добавление 4 столбцов с d_A = A_2-A; d_B = B_2-B; d_C = C_2-C; d_D = D_2-D:

     A    B    C    D    A_2    B_2    C_2    D_2   d_A   d_B   ..
1    1    2    3    2    1       2       3     2     0     0    ..
2    4    2    19   1    4       2       19    1     0     0    ..
2    2    2    3    1    2      64       2     1     0     62   ..

спасибо, R

  • 0
    Какая-то проблема с ответом?
Теги:
pandas
concatenation

1 ответ

1

Используйте concat с DataFrame.add_suffix:

df = pd.concat([df1, df2.add_suffix('_2')], axis=1)
#alternative solution
#df = df1.join(df2.add_suffix('_2'))
print (df)
   A  B  C  D  A_2  B_2  C_2  D_2
1  1  2  3  2    1    2    3    2
2  2  2  3  1    4    2   19    1
3  2  3  2  1    2   64    2    1

Еще одна идея - создать MultiIndex по keys параметров, а затем сгладить его по MultiIndex списка с помощью f-string - вывод немного отличается:

df = pd.concat([df1, df2], axis=1, keys=('1','2'))
df.columns = [f'{j}_{i}' for i, j in df.columns]
print (df)
   A_1  B_1  C_1  D_1  A_2  B_2  C_2  D_2
1    1    2    3    2    1    2    3    2
2    2    2    3    1    4    2   19    1
3    2    3    2    1    2   64    2    1
  • 0
    но если я использую df = pd.concat ([df1, df2.add_suffix ('_ 2')], axis = 1), я получаю 6 строк, а в A, B, C, D - NaN в строке 4-6 ,
  • 1
    нужны те же значения индекса, поэтому используйте df = pd.concat([df1.reset_index(drop=True), df2.add_suffix('_2').reset_index(drop=True)], axis=1)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню