Объединить, если это возможно, в противном случае объединить панды

#python #pandas

#python #панды

Вопрос:

У меня есть 3 df, которые я хотел бы объединить, где первые 3 столбца являются одними и теми же данными, если они существуют, а столбцы впоследствии являются новыми для каждого из df. Например, df[3:] отличается от df2[3:]

Я хотел бы объединить их, если у них одинаковый уникальный идентификатор, в противном случае я хотел бы объединить.

df1

 ID    A     B     2009   2010   
1     A     B        2      3
2     A     C        2      2
3     A     B        3      3
 

df2

 ID    A     B     2011   2012   
2     A     C        2      2
3     A     C        3      4
5     A     B        8      9
 

df3

 ID    A     B     2013   2014   
2     A     C        2      3
4     A     E        3      4
5     A     B        8      9
 

результат df

 ID    A     B      2009   2010   2011   2012   2013    2014
1     A     B        2      3.     2.     3.      
2     A     C        2      2.     2.     2.      2.     3 
3     A     C        3      3.     3.     4.      
4     A     E                                      3.     4 
5     A     B                      8      9        8.     9
 

Редактировать: исправлены данные df. Во-вторых, одна проблема, которую я замечаю, заключается в том, что при слиянии мои данные A и B дублируются, A_X, A_Y, A_Z, B_X, B_Y,
B_Z заранее благодарю вас

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

1. вы уверены, что ваши данные верны?

2. Почему 4. 5 в столбцах 2013, 2014 есть a?

3. исправлено. Спасибо

Ответ №1:

Попробуйте pd.concat([df.set_index('ID') for df in [df1, df2, df3]], axis=1).reset_index()

Понимание списка устанавливается ID как индекс каждого фрейма данных. Затем мы объединяем по горизонтали. Горизонтальная конкатенация пытается сопоставить индексы, где это возможно, в противном случае она добавляет строки. Наконец, мы сбрасываем индекс.

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

1. Мои столбцы A, B дублируются во всей конкатенации, и это отображается 3 раза?

2. @Leo Не уверен, какие у вас имена столбцов, но используйте set_index(['ID', 'A', 'B']) в этом случае?

Ответ №2:

С результатом что-то не так.

Но код для слияния будет выглядеть так:

 from functools import reduce
import pandas as pd
dfs = [df1,df2,df3]

df_merged = reduce(lambda  left,right: pd.merge(left,right,on=['ID'],
                                            how='outer'), dfs)
 

df_merged:

     ID  2009  2010  2011    2012    2013  2014
0   1   2.0   3.0   2.0     3.0     NaN   NaN
1   2   3.0   4.0   3.0     4.0     2.0   3.0
2   3   4.0   5.0   4.0     5.0     NaN   NaN
3   4   NaN   NaN   NaN     NaN     3.0   4.0
4   5   NaN   NaN   NaN     NaN     8.0   9.0
 

Редактировать:

Просто используйте on=['ID', 'A', 'B']

вывод:

     ID  A   B   2009 2010 2011  2012 2013 2014
0   1   A   B   2.0  3.0  NaN   NaN  NaN  NaN
1   2   A   C   2.0  2.0  2.0   2.0  2.0  3.0
2   3   A   B   3.0  3.0  NaN   NaN  NaN  NaN
3   3   A   C   NaN  NaN  3.0   4.0  NaN  NaN
4   5   A   B   NaN  NaN  8.0   9.0  8.0  9.0
5   4   A   E   NaN  NaN  NaN   NaN  3.0  4.0
 

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

1. привет, я отредактировал свой вопрос и таблицу, чтобы они соответствовали большему количеству того, что я делаю, я замечаю, когда использую ваш код, и объединение столбцов A, B дублируется в результирующем фрейме данных как A_x, A_y, A_z.

2. Я получаю сообщение об ошибке при обновлении dattime64 [ns], предположим, что столбцы A или B — это дата и время, как мне поступить?

3. хм…. что я могу сделать для столбцов A и B, если это дата?