【问题标题】:How to concatenate near duplicate rows in DataFrame如何在DataFrame中连接附近重复的行
【发布时间】:2019-04-16 19:25:11
【问题描述】:

从原始数据中,有重复数据。具有不同数据库的重复必须连接到前一个的后面。有没有办法通过数据之间的比较将两个表合并为一个,如下所示?

从使用 drop.duplicates 和 duplicated 的原始数据中,我得到了两个表并想使用字典来比较它们,但是通过将行作为两个表中的字典,每个字典中的键都是相同的,我不能将它们合并在一起。

这是给出的原始数据

  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”的顺序并不重要,但数据库必须按字母顺序从左到右排序。

【问题讨论】:

    标签: python pandas dataframe dictionary


    【解决方案1】:

    我认为最简单的方法是使用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
    

    【讨论】:

    • 嗨!这里还有一个问题,如果匹配需要DB以外的完全匹配怎么办,是否仍然可以使用cumcount?这意味着 TITLE ISSN IBSN 都必须匹配,否则它被认为不是重复的,并且必须转到另一行。
    • @WeiLunss 将df.groupby('TITLE') 更改为df.groupby(['TITLE', 'ISSN', 'ISBN']),它应该可以工作......如果不是我建议打开另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2019-01-03
    • 2021-07-31
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多