检测两个数据框中是否存在重叠值。

3
df1 = pd.DataFrame({"fields": [["boy", "apple", "toy", "orange", "bear", "eat"], 
                              ["orange", "girl", "red"]]})
df2 = pd.DataFrame({"other fields": [["boy", "girl", "orange"]}) 

我想在df1中添加一列,指示字段与其他字段重叠的情况, 样本输出:

|fields| overlap?|
|------|---------|
|boy   |Y
|apple |N
|toy   |N
|orange|Y
|bear  |N
|eat   |N
|orange|Y
|girl  |Y
|red   |N

首先,我将在df1上分解字段,但我不确定检查两个数据框之间重叠值的下一步是什么。谢谢!


1
为什么df1中第一个橙色的重叠是“Y”,但第二个不是? - Emi OB
抱歉,这是一个打字错误。 - siusiusiu
5个回答

2

您也可以不使用apply。如您所说,您可以使用explode,然后使用isin检查df2中是否存在值,这将返回True / False,然后在其上映射'Y' / 'N':

df1_exp = df1.explode('fields',ignore_index=True)
df1_exp['overlap'] = df1_exp['fields'].isin(df2['other fields']).map({True:'Y',False:'N'})


   fields overlap
0     boy       Y
1   apple       N
2     toy       N
3  orange       Y
4    bear       N
5     eat       N
6  orange       Y
7    girl       Y
8     red       N

2

您可以使用 isin 函数在将两个 df 都展开后找到重叠的值,并使用 np.wherebool 更改为 Y/N

df1 = pd.DataFrame({"fields": [["boy", "apple", "toy", "orange", "bear", "eat"], ["orange", "girl", "red"]]})
df2 = pd.DataFrame({"other fields": [["boy", "girl", "orange"]]})

df1 = df1.explode('fields', ignore_index=True)
df1['overlap'] = np.where(df1['fields'].isin(df2['other fields'].explode()), 'Y', 'N')
print(df1)

输出

   fields overlap
0     boy       Y
1   apple       N
2     toy       N
3  orange       Y
4    bear       N
5     eat       N
6  orange       Y
7    girl       Y
8     red       N

1
你可以尝试使用 .isin() 方法:
df1 = df1.explode("fields")
df1["overlap"] = df1["fields"].isin(df2["other fields"][0])

您可以随后将True/False替换为Y/N。


1

另一种方法是使用np.select。我通常用它来处理大数据集,其中一些方法可能需要一段时间才能执行:

df1 = df1.explode(column='fields')
df1['overlap'] = np.select([df1.fields.isin(df2['other fields'])], ['Y'], 'N')

   index  fields overlap
0      0     boy       Y
1      0   apple       N
2      0     toy       N
3      0  orange       Y
4      0    bear       N
5      0     eat       N
6      1  orange       Y
7      1    girl       Y
8      1     red       N

1

这应该可以工作

df1 = df1.explode("fields")
df1["overlap"] = df1["fields"].apply(lambda x: "Y" if x in df2["other fields"].values else "N")

    fields  overlap
0   boy     Y
0   apple   N
0   toy     N
0   orange  Y
0   bear    N
0   eat     N
1   orange  Y
1   girl    Y
1   red     N

你在橙子的两个条目中都有一个 Y,但示例中只有第一个。OP没有明确说明这是期望的还是打字错误。 - Emi OB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接