Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 有没有办法将一个数据帧的值与第二个数据帧的值进行比较?_Python 3.x_Pandas_Dataframe_Match - Fatal编程技术网

Python 3.x 有没有办法将一个数据帧的值与第二个数据帧的值进行比较?

Python 3.x 有没有办法将一个数据帧的值与第二个数据帧的值进行比较?,python-3.x,pandas,dataframe,match,Python 3.x,Pandas,Dataframe,Match,我有两个熊猫数据帧,每个数据帧有5列,大约1000行(使用python3)。 我有兴趣将df1中的第一列与df2中的第一列进行比较,如下所示: DF1 [index] [col1] 1 "foobar" 2 "acksyn" 3 "foobaz" 4 "ackfin" ... ... 我想要实现的是:对于DF1的每一行,如果DF1.col1以DF2.col1的任何值结尾,则删除该行。 在本例中,生成的DF1应为:

我有两个熊猫数据帧,每个数据帧有5列,大约1000行(使用python3)。
我有兴趣将
df1
中的第一列与
df2
中的第一列进行比较,如下所示:

DF1
[index]   [col1]
1         "foobar"
2         "acksyn"
3         "foobaz"
4         "ackfin"
...       ...
我想要实现的是:对于
DF1
的每一行,如果
DF1.col1
DF2.col1
的任何值结尾,则删除该行。
在本例中,生成的
DF1
应为:

DF1
[index]   [col1]
2         "acksyn"
3         "foobaz"
...       ...
(参见
DF2
索引2和索引4是
DF1
索引1和索引4的最后一部分)

我尝试使用内部定义的函数,如:

def check_presence(df1_col1, second_csv):
    for index, row in second_csv.iterrows():
        search_string = "(?P<first_group>^(" + some_string + "))(?P<the_rest>" + row["col1"] + "$)"
        if re.search(search_string, df1_col1):
            return True
    return False
def检查是否存在(df1\u col1,第二个\u csv):
对于索引,第二个_csv.iterrows()中的行:
search_string=“(?P^(“+some_string+”)(?P“+行[“col1”]+“$)”
如果重新搜索(搜索字符串,df1\u col1):
返回真值
返回错误
以及使用此格式的说明:
index=csv[csv.col1.str.contains(some_regex,regex=True,na=False)]。index

但在这两种情况下,python控制台都无法将非字符串对象与字符串进行比较
我做错了什么?我甚至可以在加入2个CSV后尝试一个解决方案,但我认为我最终需要做同样的事情

感谢您的耐心,我是python新手…

如果您想使用
str.contains
方法,首先需要
df2
中加入您的关键字

import pandas as pd

df = pd.DataFrame({'col1': {0: 'foobar', 1: 'acksyn', 2: 'foobaz', 3: 'ackfin'}})
df2 = pd.DataFrame({'col1': {0: 'old', 1: 'fin', 2: 'new', 3: 'bar'}})

print (df["col1"].str.contains("|".join(df2["col1"])))

#
0     True
1    False
2    False
3     True
拿着你的相框

frame1 =frame1=pd.DataFrame({"col1":["foobar","acksyn","foobaz","ackfin"]})
frame2=pd.DataFrame({"col1":["old","fin","new","bar"]})
然后

最后

 frame1["col2"]=frame1["col1"].str.contains(pattern)
frame1.loc[frame1["col2"]==True]
     col1  col2
0  foobar  True
3  ackfin  True
可能的解决办法
“”对于DF1的每一行,如果DF1.col1以DF2.col1的任何值结尾,则删除该行。“”

如果我理解正确,这是一行:
#搜索子字符串
#生成带有联接的“或”语句
#如果匹配,请退出。
df[~df.col1.str.contains('|'.join(df2.col1.values))]
这将仅保留DF2.Col1为而不是在DF1.Col1中找到的的行


“对于DF1的每一行,如果DF1.col1以DF2.col1的任何值结尾,则删除该行。”“您知道DF1.col1与DF2.col1匹配的值的数量吗?”?是否只是DF1.col1的最后3个值与DF2.col1匹配?不,我不知道每个值的确切数目。匹配必须是整个DF2.col1值,而不是最后三个。这些都是一个例子没问题-我添加了一个可以解决您需求的单行程序。它是否可以变成这样:
df[~df1.col1.str.contains(“$|”。.join(df2.col1.str)+“$”,regex=True,na=False)]
?DF1字符串应以DF2中的任何一个结束,以便删除。如果删除时添加了过滤值,则可以删除
myList=frame2.col2.values
pattern='|'.join(myList)
 frame1["col2"]=frame1["col1"].str.contains(pattern)
frame1.loc[frame1["col2"]==True]
     col1  col2
0  foobar  True
3  ackfin  True