Объединить отдельные столбцы в двух фреймах данных с помощью панд (и добавить похожие столбцы) - PullRequest
0 голосов
/ 02 октября 2018

Мой вопрос тесно связан с Слияние панд - Как избежать дублирования столбцов , но не идентичны.

Я хочу объединить столбцы, которые различаются в трехdataframes.Кадры данных имеют идентификатор столбца и некоторые идентичные столбцы: Пример.

df1

id place name qty unit A 
1 NY    Tom   2  10   a
2 TK    Ron   3  15   a
3 Lon   Don   5  90   a
4 Hk    Sam   4  49   a

df2

id place name qty unit B 
1 NY    Tom   2  10   b
2 TK    Ron   3  15   b
3 Lon   Don   5  90   b
4 Hk    Sam   4  49   b

df3

id place name qty unit C D
1 NY    Tom   2  10   c d
2 TK    Ron   3  15   c d
3 Lon   Don   5  90   c d
4 Hk    Sam   4  49   c d

Результат:

id place name qty unit A B C D
1 NY    Tom   2  10   a b c d
2 TK    Ron   3  15   a b c d
3 Lon   Don   5  90   a b c d
4 Hk    Sam   4  49   a b c d

Столбцы place, name, qty и unit всегда будут частью трех информационных фреймов, имена разных столбцов могут различаться (A, B, C, D вмой пример).Три кадра данных имеют одинаковое количество строк.

Я пробовал:

cols_to_use = df1.columns - df2.columns
dfNew = merge(df, df2[cols_to_use], left_index=True, right_index=True, how='outer')

Проблема в том, что я получаю больше строк, чем ожидалось, и столбцы переименовываются в результирующий кадр данных (при использовании concat).

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Использование concat с groupby и first:

pd.concat([df1, df2, df3], 1).groupby(level=0, axis=1).first()

   A  B  C  D  id name place  qty  unit
0  a  b  c  d   1  Tom    NY    2    10
1  a  b  c  d   2  Ron    TK    3    15
2  a  b  c  d   3  Don   Lon    5    90
3  a  b  c  d   4  Sam    Hk    4    49
0 голосов
/ 02 октября 2018

Вы можете извлечь только те столбцы из df2df3 аналогично), которых еще нет в df1.Затем просто используйте pd.concat для объединения фреймов данных:

cols = [c for c in df2.columns if c not in df1.columns]
df = pd.concat([df1, df2[cols]], axis=1)
0 голосов
/ 02 октября 2018

Использование reduce из functools

from functools import reduce
reduce(lambda left,right: pd.merge(left,right), [df1,df2,df3])
Out[725]: 
   id place name  qty  unit  A  B  C  D
0   1    NY  Tom    2    10  a  b  c  d
1   2    TK  Ron    3    15  a  b  c  d
2   3   Lon  Don    5    90  a  b  c  d
3   4    Hk  Sam    4    49  a  b  c  d
0 голосов
/ 02 октября 2018

Вы можете использовать вложенное слияние

merge_on = ['id','place','name','qty','unit']
df1.merge(df2, on = merge_on).merge(df3, on = merge_on)



    id  place   name    qty unit    A   B   C   D
0   1   NY      Tom     2   10      a   b   c   d
1   2   TK      Ron     3   15      a   b   c   d
2   3   Lon     Don     5   90      a   b   c   d
3   4   Hk      Sam     4   49      a   b   c   d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...