比较两个数据帧并找到列的唯一组合

时间:2017-03-01 03:42:06

标签: python pandas

我有两个不同大小和不同列数的DataFrame,例如:

DF1:
index  col1  col2  col3 
 1      AA    A12  SH7B
 2      Ac    DJS  283
 3      ZH    28S  48d

DF2:
index  col1  col2    col3    col4
 2      AA    cc2    SH7B    hd5
 7      Ac    DJS  283,dhb   re
 10     ZH    28S  SJE,48d   385d
 23    3V4    38D  350,eh4   sm4
 44     S3    3YE  032,she   3927

因此索引不同。并且在第一个数据帧中有一些独特的数据组合,这与其他数据帧类似,我想找到它们。所以我想迭代第二个数据帧的行并找到每行的每个数据组合(例如:( 7,Ac,DJS,283,re)和(7,Ac,DJS,dhb,re)是索引7的两种组合,因为存在具有多于一个值的列)并将其与第一数据帧进行比较'如果第二个数据帧中存在相同的组合,则将其打印出来。

result: 
 1      Ac    DJS  283
 2     ZH    28S  48d

谢谢

1 个答案:

答案 0 :(得分:0)

首先需要从数据帧2 拆分 col3 ,然后将其与数据帧1合并;要拆分数据框2的 col3 ,一种常见的方法是在使用numpy.repeat时将col3拆分并展平,以使其他列的长度相等:

import pandas as pd
import numpy as np
from itertools import chain

# count how many repeats are needed for other columns based on commas
repeats = df2.col3.str.count(",") + 1        

# repeat columns except for col3, split and flatten col3 and merge it back with df1
(df2.drop('col3', 1).apply(lambda col: np.repeat(col, repeats))
 .assign(col3 = list(chain.from_iterable(df2['col3'].str.split(','))))
 .merge(df1))

# col1  col2    col4    col3
#0  Ac   DJS      re     283
#1  ZH   28S    385d     48d