Союз двух панд DataFrames - PullRequest
       7

Союз двух панд DataFrames

0 голосов
/ 22 января 2019

Скажем, у меня есть два фрейма данных:

df1:

  A
0 a
1 b

df2:

  A
0 a
1 c

Я хочу, чтобы результат был union из двух фреймов с дополнительным столбцом , показывающим исходный фрейм данных, которому принадлежит строка.В случае дубликатов дубликаты должны быть удалены, и в соответствующем дополнительном столбце должны быть указаны оба источника:

  A  B
0 a  df1, df2
1 b  df1
2 c  df2

Я могу получить объединенный фрейм данных (df3) без дубликатов следующим образом:

import pandas as pd
df3=pd.concat([df1,df2],ignore_index=True).drop_duplicates().reset_index(drop=True)

Я не могу придумать / найти метод, который бы контролировал, куда и куда попадает элемент.Как добавить дополнительный столбец?

Большое спасибо за советы.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Используйте следующую команду:

df3 = pd.concat([df1.assign(source='df1'), df2.assign(source='df2')]) \
    .groupby('A') \
    .aggregate(list) \
    .reset_index()

Результат будет:

   A      source
0  a  [df1, df2]
1  b       [df1]
2  c       [df2]

assign добавит столбец с именем source со значением df1 и df2 к вашим данным.Команда groupby группирует строки с одинаковым значением A в одну строку.Команда aggregate описывает, как агрегировать другие столбцы (source) для каждой группы строк с одинаковым A.Я использовал list статистическую функцию, чтобы столбец source представлял собой список значений с таким же A.

0 голосов
/ 22 января 2019

Мы используем внешнее соединение, чтобы решить эту проблему -

df1 = pd.DataFrame({'A':['a','b']})
df2 = pd.DataFrame({'A':['a','c']})
df1['col1']='df1'
df2['col2']='df2'
df=pd.merge(df1, df2, on=['A'], how="outer").fillna('')
df['B']=df['col1']+','+df['col2']
df['B'] = df['B'].str.strip(',')
df=df[['A','B']]
df

   A        B
0  a  df1,df2
1  b      df1
2  c      df2
0 голосов
/ 22 января 2019

Объединение с аргументом indicator и переназначение результата:

m = {'left_only': 'df1', 'right_only': 'df2', 'both': 'df1, df2'}

result = df1.merge(df2, on=['A'], how='outer', indicator='B')
result['B'] = result['B'].map(m)

result
   A         B
0  a  df1, df2
1  b       df1
2  c       df2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...