我有两个不同的数据框填充了不同的名称集。例如:
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中,则会引发错误,因此我甚至无法继续执行评论中提到的下一步,比较其中的值团体(名字)。
答案 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)