当前位置: 首页 > 知识库问答 >
问题:

使用用户定义的比较函数在两个数据帧之间查找

拓拔俊艾
2023-03-14

我有两个熊猫数据帧(示例是说明性的)。df1['list\u of_keywords']和df2['list\u of_words']列分别包含单词列表。

df1 = pd.DataFrame(columns=('some_data','another_data','list_of_keywords'))
df2= pd.DataFrame(columns=('something','something_more','something_else','list_of_words'))

df1:

df2:

对于df1['list\u of_keywords'](源单元格)中的每个单元格,我想了解df2['list\u of_words'](目标单元格)中是否存在匹配的单元格。匹配单元格定义为包含源单元格中的所有单词的单元格(它可能包含其他不在源单元格中的单词)。我还想在df1中添加一列来记录匹配结果(如果匹配,则为True,如果不匹配,则为False)。在上面的示例中,对于df1的第一行,df1和df2之间存在匹配,但对于df1的第二行,不存在匹配。

这里有一个比较两个单词列表的函数,我想使用它:

def compare_names(wordlist1, wordlist2):
    shorter = wordlist1
    longer = wordlist2
    if len(wordlist2) < len(wordlist1):
        t = shorter
        shorter = longer
        longer = t
    result = all(item in longer for item in shorter)
    return result

df1有大约50k行,df2有500-600k行。“list_of_keywords”中的每一项大约有2-5个单词,“list_of_words”中的每一项大约有3-10个单词,所以内存不是问题。

问题:除了在两个数据帧之间显式循环外,有没有更快/更短/更具Pythonic风格的方法来解决这个问题?我使用的是Python v3.7和Pandas v1.2.4

共有1个答案

郭思聪
2023-03-14

你可以试试这个:

# Setup
import pandas as pd

df1 = pd.DataFrame(
    {
        "some_data": ["id0001", "id0002", "id0003"],
        "another_data": [12391, 3233, 3426],
        "list_of_keywords": [
            ["word1", "word2", "word3"],
            ["word7", "word8", "word7"],
            ["word1", "word2", "word4"],
        ],
    }
)
df2 = pd.DataFrame(
    {
        "something": ["id_abcd", "id_eeed", "id_dgef"],
        "something_more": ["ref34322", "ref5555", "ref2963"],
        "something_else": ["some comment", "some comment", "some comment"],
        "list_of_words": [
            ["word5", "word4", "word5", "word4", "word9"],
            ["word5", "word3", "word2", "word4", "word1"],
            ["word1", "word2", "word3", "word4", "word6"],
        ],
    }
)

# Data preparation
lists_of_keywords = df1["list_of_keywords"].values
lists_of_words = df2["list_of_words"].values

# Iterate to find a match
match = {"in_df2": []}
for list_of_keywords in lists_of_keywords:
    search = []
    for list_of_words in lists_of_words:
        if set(list_of_keywords).issubset(set(list_of_words)):
            search.append(True)
        else:
            search.append(False)
    if any(search):
        match["in_df2"].append("True")
    else:
        match["in_df2"].append("False")

df1["in_df2"] = pd.DataFrame(match)

print(df1)
# Outputs
  some_data  another_data       list_of_keywords in_df2
0    id0001         12391  [word1, word2, word3]   True
1    id0002          3233  [word7, word8, word7]  False
2    id0003          3426  [word1, word2, word4]   True
 类似资料:
  • 我想比较这两个函数的值。不幸的是,我试图使,但我一直得到。 我想检查如果。这就是我上面完整的代码。

  • 我试图建立一个函数,检查一个单词或文本是否是回文。要做到这一点,它拆分文本,使每个字母都是一个新数组的元素,它去掉空白,并建立反向数组。然后检查两个数组中处于相同位置的每个元素是否相等。如果不是,则返回false,如果是,则返回true。这里的函数是: 我不知道出了什么问题,但是不管我传递给函数什么单词或文本,函数似乎都在返回一个真值。那有什么不好?

  • 我有两个数据帧DF1和DF2。 DF1: DF2: 我需要来自DF2的行数,其中EmploymentType='Employee',EmpStatus='Active',EmpStartDate 输出: 如何在不合并两个数据帧的情况下实现这一点? 我不能合并数据帧,因为没有公共键,而且因为我需要基于条件的行数,我不能在任何临时列上加入数据帧,因为我需要避免交叉连接。

  • 我有两个数据帧df1和df2,其中df2是df1的子集。我如何获得一个新的数据帧(df3),它是两个数据帧之间的差值? 换句话说,一个数据帧,它包含了df1中所有的行/列,而不是DF2中的行/列?

  • 请参阅Python代码,在给定的两个数字下部和上部之间查找质数: Python输出: 几乎相似的代码在朱莉娅给出不正确的输出。请参阅下面的Julia代码: Julia输出: 显然,9和15不是质数。为什么Python代码给出正确的输出,而Julia代码没有。有没有办法用同样的算法逻辑来解决它?

  • 我有两个数据库,Oracle和MySQL。目标是将Oracle表中的值保存到MySQL,要求:MySQL表中不存在数据。 但我很难理解春批。在step中,它包含itemReader、itemProcessor和ItemWriter。如果我的理解是正确的,一个步骤只能有一个项目阅读器(cmiiw) 我的计划是做两个步骤: