Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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 如何在数据框中将列表用作搜索条件?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何在数据框中将列表用作搜索条件?

Python 如何在数据框中将列表用作搜索条件?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在努力熟悉python编码,我想在下面的任务中寻求一些帮助 我已经从ExcelDFA和dfB中导入了两个数据帧。我想在dfB中计算来自dfA的每一行的匹配。 为此,我转换了dfSearch=dfA['Title'].tolist()将其作为要搜索的值列表传递 我的做法如下: for i in searchDF: result = dfB['COL1'].count(i) 然后我想在dfA中添加一个新列,它将存储每行的结果 dfA['FIND_VAL1'] = result

我正在努力熟悉python编码,我想在下面的任务中寻求一些帮助

我已经从ExcelDFA和dfB中导入了两个数据帧。我想在dfB中计算来自dfA的每一行的匹配。 为此,我转换了
dfSearch=dfA['Title'].tolist()
将其作为要搜索的值列表传递

我的做法如下:

for i in searchDF:
    result = dfB['COL1'].count(i)
然后我想在dfA中添加一个新列,它将存储每行的结果

    dfA['FIND_VAL1'] = result
如果这个任务看起来很琐碎,我很抱歉,但我对python完全陌生,需要一些帮助

数据示例A:

title 
plane 
house 
car
title 
aero plane 
household 
luxury cars 
house decorations
title   Results    
plane     1     
house     2    
car       1
数据示例B:

title 
plane 
house 
car
title 
aero plane 
household 
luxury cars 
house decorations
title   Results    
plane     1     
house     2    
car       1
结果示例:

title 
plane 
house 
car
title 
aero plane 
household 
luxury cars 
house decorations
title   Results    
plane     1     
house     2    
car       1

您可以在列表中调用
str.count

dfA['Results'] = [dfB.title.str.count(x).sum() for x in dfA.title]
dfA

   title  Results
0  plane        1
1  house        2
2    car        1

使用纯Python
sum
str.count
的替代列表理解为:


对于小数据来说,这个似乎更快,但可能无法扩展。

使用
numpy.core.defchararray
中的
count
ufunc
和一些
numpy
广播魔术

from numpy.core.defchararray import count

b = dfB.title.values.astype(str)
a = dfA.title.values[:, None]
dfA.assign(Results=count(b, a).sum(1))

   title  Results
0  plane        1
1  house        2
2    car        1

设置

dfA = pd.DataFrame(dict(title=['plane', 'house', 'car']))

dfB = pd.DataFrame(dict(
    title=['aero plane', 'household', 'luxury cars', 'house decorations']
))

我首先尝试合并数据帧:

df = pd.merge(dfA, dfB, on = "title")

您在这些列上尝试过内部连接熊猫吗?请提供dfA和dfB的示例以及预期输出。如果要使用理解,请参阅本文,不要中途停止
dfA.assign(Results=[sum([x.count(y)在dfB.title.values.tolist()中表示x)在dfA.title.values.tolist()中表示y在dfA.values.tolist()中表示y)
这会更快。@piRSquared您确定它可以扩展到更大的数据吗?尚未完成该测试。但您的解决方案的时间复杂性是相同的。两者都是二次标度。我的也是!我不知道怎么解决这个问题
O(nxm)
但是对小数据的理解要比对str.count().sum()的理解快。@piRSquared恼人的是,你还必须寻找子字符串匹配。否则,您可以使用
集合。计数器
并在线性时间内完成此操作。@COLDSPEED我已测试了您的解决方案,但遇到错误:在位置23多次重复为什么我出现错误?