Как объединить около повторяющихся строк в DataFrame - PullRequest
2 голосов
/ 16 апреля 2019

Исходные данные дублируются.Дубликаты с разными БД должны быть конкатезированы в конец предыдущей. Есть ли способ объединить две таблицы в одну, как показано ниже, сравнивая данные?

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

Этопредоставлены исходные данные

  DB TITLE  ISSN  IBSN
0  M     a     1   NaN
1  M     d     1   NaN
2  M     c     1   NaN
3  N     b     1   NaN
4  N     a     1   NaN
5  N     d     1   NaN
6  O     c     1   NaN
7  O     e     1   NaN
8  O     a     1   NaN
9  O     b     1   NaN

Используя drop_duplicates и дубликаты:

  DB TITLE  ISSN  IBSN             DB TITLE  ISSN  IBSN        
0  M     a     1   NaN           0  N     a     1   NaN        
1  M     d     1   NaN           1  N     d     1   NaN         
2  M     c     1   NaN           2  O     c     1   NaN       
3  N     b     1   NaN           3  O     a     1   NaN
4  O     e     1   NaN           4  O     b     1   NaN

Это тип словаря, который я получаю из строк:

{'DB': 'N', 'TITLE': 'a', 'ISSN': 1, 'IBSN': 'NaN'}
{'DB': 'M', 'TITLE': 'a', 'ISSN': 1, 'IBSN': 'NaN'}

Я ожидаювывод будет

    DB TITLE  ISSN  IBSN   DB TITLE  ISSN ISBN   DB TITLE  ISSN  IBSN
0    M     a   1.0   NaN    N     a   1.0  NaN    O     a   1.0   NaN
1    N     b   1.0   NaN    O     b   1.0  NaN  NaN   NaN   NaN   NaN
2    M     d   1.0   NaN    N     d   1.0  NaN  NaN   NaN   NaN   NaN
3    M     c   1.0   NaN    O     c   1.0  NaN  NaN   NaN   NaN   NaN
4    O     e   1.0   NaN  NaN   NaN   NaN  NaN  NaN   NaN   NaN   NaN

Порядок 'TITLE' в столбце не важен, но БД необходимо сортировать в алфавитном порядке слева направо.

1 Ответ

2 голосов
/ 16 апреля 2019

Я думаю, что самый простой способ сделать это - использовать cumcount для разделения подгрупп, а затем использовать concat с join='outer':

grps = [
    g.set_index('TITLE') for _, g in df.groupby(df.groupby('TITLE').cumcount())
]
pd.concat(grps, join='outer', axis=1, sort=True)

  DB  ISSN  IBSN   DB  ISSN  IBSN   DB  ISSN  IBSN
a  M     1   NaN    N   1.0   NaN    O   1.0   NaN
b  N     1   NaN    O   1.0   NaN  NaN   NaN   NaN
c  M     1   NaN    O   1.0   NaN  NaN   NaN   NaN
d  M     1   NaN    N   1.0   NaN  NaN   NaN   NaN
e  O     1   NaN  NaN   NaN   NaN  NaN   NaN   NaN

Если вам тоже нужно "TITLE", используйте set_index с drop=False:

grps = [
    g.set_index('TITLE', drop=False) 
    for _, g in df.groupby(df.groupby('TITLE').cumcount())
]
pd.concat(grps, join='outer', axis=1, sort=True)

  DB TITLE  ISSN  IBSN   DB TITLE  ISSN  IBSN   DB TITLE  ISSN  IBSN
a  M     a     1   NaN    N     a   1.0   NaN    O     a   1.0   NaN
b  N     b     1   NaN    O     b   1.0   NaN  NaN   NaN   NaN   NaN
c  M     c     1   NaN    O     c   1.0   NaN  NaN   NaN   NaN   NaN
d  M     d     1   NaN    N     d   1.0   NaN  NaN   NaN   NaN   NaN
e  O     e     1   NaN  NaN   NaN   NaN   NaN  NaN   NaN   NaN   NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...