如何比较两个不同数据帧组中的值?

时间:2018-03-22 18:20:23

标签: python pandas

我有两个不同的数据框填充了不同的名称集。例如:

t1 = pd.DataFrame(['Abe, John Doe', 'Smith, Brian', 'Lin, Sam', 'Lin, Greg'], columns=['t1'])
t2 = pd.DataFrame(['Abe, John', 'Smith, Brian', 'Lin, Sam', 'Lu, John'], columns=['t2'])

我需要找到两个数据集之间的交集。我的解决方案是用逗号分割,然后用姓氏分组。然后,我将能够比较姓氏,然后查看t2的名字是否包含在t1中。 [' Lu,John']是上面例子中应该返回的唯一一个。

我需要帮助的是如何比较按公共列分组的两个不同数据帧中的值。有没有办法将groupby的结果与两个不同的数据帧相交,然后比较每个键值对中的值?我需要在t2中提取t1中的名称。

我知道它看起来应该是这样的:

for last in t1:
   print(t2.get_group(last)) #BUT run a compare between the two different lists here

唯一的问题是,如果姓氏不存在于第二个groupby中,则会引发错误,因此我甚至无法继续执行评论中提到的下一步,比较其中的值团体(名字)。

2 个答案:

答案 0 :(得分:0)

这不是特定的pandas,但是python有一个带有交叉操作的内置集合类,这里是文档:https://docs.python.org/3/library/stdtypes.html?highlight=set#set

它的工作方式如此

set1 = set(my_list_of_elements)
set2 = set(my_other_list_of_elements)
intersecting_elements = set1 & set2

很难说这是否是您正在寻找的内容,请通过最低限度,完整且可验证的示例进行更新,如评论所说,以获得更准确的答案。

更新 - 基于评论

for last in t1:
    try:
        t2_last_group = t2.get_group(last)
        # perform compare here
    except:
        pass

答案 1 :(得分:0)

我最终搞清楚了。 pandas数据框似乎寻找包含(...)。any(),所以我包含了那些。无法在第二组数据帧中找到值的问题,我用try / exception包围了代码。解决方案概述如下。

t1final = []
for index, row in t1.iterrows():
    t1lastname = row['last']
    t1firstname = row['first']
    try:
        x = t2groupby.get_group(t1lastname)
        if(~x['first'].str.contains(t1firstname,case=False).any()):
            t1final.append(t1lastname + ', ' + t1firstname)
    except:
        t1final.append(t1lastname + ', ' + t1firstname)