我有两个熊猫数据帧(示例是说明性的)。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
你可以试试这个:
# 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) 我的计划是做两个步骤: