`pandas.merge` не распознает тот же индекс - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть два кадра данных с перекрывающимися столбцами, но идентичные индексы, и я хочу объединить их.Я чувствую, что это должно быть прямо вперед, но я проработал ооочень много примеров и SO вопросов, и это не работает, но, похоже, не согласуется с другими примерами.

import pandas as pd
# create test data
df = pd.DataFrame({'gen1': [1, 0, 0, 1, 1], 'gen3': [1, 0, 0, 1, 0], 'gen4': [0, 1, 1, 0, 1]}, index = ['a', 'b', 'c', 'd', 'e'])
df1 = pd.DataFrame({'gen1': [1, 0, 0, 1, 1], 'gen2': [0, 1, 1, 1, 1], 'gen3': [1, 0, 0, 1, 0]}, index = ['a', 'b', 'c', 'd', 'e'])

In [1]: df
Out[1]: 
   gen1  gen2  gen3
a     1     0     1
b     0     1     0
c     0     1     0
d     1     1     1
e     1     1     0

In [2]: df1
Out[2]: 
   gen1  gen3  gen4
a     1     1     0
b     0     0     1
c     0     0     1
d     1     1     0
e     1     0     1

После проработки всех примеров здесь(https://pandas.pydata.org/pandas-docs/stable/merging.html) Я убежден, что нашел правильный пример (первый и второй пример слияний). Второй пример таков:

In [43]: result = pd.merge(left, right, on=['key1', 'key2'])

В их примере у них есть два DF(слева и справа), которые имеют перекрывающиеся столбцы и идентичные индексы, а их результирующий информационный кадр имеет одну версию каждого столбца и исходные индексы, но это не то, что происходит, когда я делаю это:

# get the intersection of columns (I need this to be general)
In [3]: column_intersection = list(set(df).intersection(set(df1))

In [4]: pd.merge(df, df1, on=column_intersection)
Out[4]: 
   gen1  gen2  gen3  gen4
0     1     0     1     0
1     1     0     1     0
2     1     1     1     0
3     1     1     1     0
4     0     1     0     1
5     0     1     0     1
6     0     1     0     1
7     0     1     0     1
8     1     1     0     1

Здесь мы видим, чтоСлияние не видел, что индексы одинаковы! Я возился с опциями, но не могу получить желаемый результат.

Здесь был задан похожий, но другой вопрос Как сохранить индекс при использовании пандобъединить но я не совсем понимаю ответы и поэтому не могу связать это с моей проблемой.

Поцелые числа для этого конкретного примера:

  • Индекс всегда будет одинаковым.
  • Столбцы с одинаковым именем всегда будут иметь одинаковые записи (т.е. они являются дубликатами).

Было бы замечательно иметь решение для этой конкретной проблемы, но я также очень хотел бы понять это, потому что время от времени трачу много времени на объединение фреймов данных.Я люблю панд, и в целом я нахожу это очень интуитивно понятным, но я просто не могу привыкнуть ни к чему, кроме тривиальных комбинаций информационных кадров.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

В этом особом случае вы можете использовать assign
Вещи в df имеют приоритет, но все остальные в df1 включены.

df1.assign(**df)

   gen1  gen2  gen3  gen4
a     1     0     1     0
b     0     1     0     1
c     0     1     0     1
d     1     1     1     0
e     1     1     0     1

**df распаковывает df в предположении контекста словаря.Эта распаковка доставляет аргументы ключевого слова в assign с именами столбцов в качестве ключевого слова и столбца в качестве аргумента.

Это то же самое, что

df1.assign(gen1=df.gen1, gen3=df.gen3, gen4=df.gen4)
0 голосов
/ 06 декабря 2018

Начиная с версии 0.23, вы можете указать индексное имя для ключа соединения, если оно у вас есть.

df.index.name = df1.index.name = 'idx'
df.merge(df1, on=list(set(df).intersection(set(df1)) | {'idx'}))

     gen1  gen3  gen4  gen2
idx                        
a       1     1     0     0
b       0     0     1     1
c       0     0     1     1
d       1     1     0     1
e       1     0     1     1 

Здесь предполагается, что ваш фактический DataFrame не имеет точно такие же значения в перекрывающихсяколонны.Если это так, то ваш вопрос будет касаться конкатенации - для этого вы можете использовать pd.concat:

c = list(set(df).intersection(set(df1)))
pd.concat([df1, df.drop(c, 1)], axis=1)

     gen1  gen2  gen3  gen4                     
a       1     0     1     0
b       0     1     0     1
c       0     1     0     1
d       1     1     1     0
e       1     1     0     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...