我正在尝试熟悉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
答案 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 sum
和str.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.defchararray
和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']
))
答案 2 :(得分:0)
我首先尝试合并数据帧:
df = pd.merge(dfA, dfB, on = "title")