#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, если это дата?