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

时间:2017-08-31 14:44:00

标签: python pandas dataframe

我正在尝试熟悉python编码,我想在以下任务中提一点帮助。

我从excel dfA和dfB导入了两个数据帧和pandas。我想在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

数据示例B:

title 
aero plane 
household 
luxury cars 
house decorations

结果示例:

title   Results    
plane     1     
house     2    
car       1

3 个答案:

答案 0 :(得分: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 sumstr.count作为suggested by piR的替代列表理解:

dfA = dfA.assign(Results=[sum([x.count(y) for x in dfB.title.values.tolist()]) 
                                       for y in dfA.title.values.tolist()])
dfA
   title  Results
0  plane        1
1  house        2
2    car        1

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

答案 1 :(得分:1)

使用count中的ufunc numpy.core.defchararraynumpy广播魔术。

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']
))

答案 2 :(得分:0)

我首先尝试合并数据帧:

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