如何在DataFrame中的重复行附近串联

时间:2019-04-16 19:25:12

标签: python pandas dataframe dictionary

从原始数据来看,有重复的数据。具有不同数据库的重复项必须与前一个表的后面相结合。是否有任何方法可以通过比较数据之间的关系将两个表合并为一个表,如下所示?

使用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 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用cumcount分隔子组,然后将concatjoin='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_indexdrop=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