python - 如何在 DataFrame 中连接附近重复的行

标签 python pandas dataframe dictionary

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

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

最佳答案

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

关于python - 如何在 DataFrame 中连接附近重复的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715334/

相关文章:

python - 如何将系列或序列分配给 dask 数据框列?

python - 删除数据框中所有单元格中的多余空格

Python 脚本无法加载 Django 设置模块 -- ImportError

Python 类型错误 : 'NoneType' object has no attribute '__getitem__' for Google Search

Python多行到一行

python - 根据原始列和新列中的前一个单元格计算新的 DataFrame 列

python - 是否可以根据节点大小更改字体大小?

python - 使用 Python 将 JSON 嵌套到扁平化 JSON

python - 如何通过使用 python 对行值进行分组来查找多列中的最大值?

pandas - python Pandas : dataframe read rows (readlines)