Python 如何在数据框中将列表用作搜索条件?
我正在努力熟悉python编码,我想在下面的任务中寻求一些帮助 我已经从ExcelDFA和dfB中导入了两个数据帧。我想在dfB中计算来自dfA的每一行的匹配。 为此,我转换了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
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多次重复为什么我出现错误?