2017-08-31 46 views
1

我想熟悉python编码,我想在以下任务中寻求一点帮助。如何使用列表作为数据框中的搜索条件?

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

我的做法是这样的:

for i in searchDF: 
    result = dfB['COL1'].count(i) 

然后我想在DFA中添加一个新列将存储每一行​​的结果。

dfA['FIND_VAL1'] = result 

对不起,如果这个任务看起来微不足道,但我是完全新的python和拉力赛需要一些帮助。

数据示例的:

title 
plane 
house 
car 

数据例B:

title 
aero plane 
household 
luxury cars 
house decorations 

结果例如:

title Results  
plane  1  
house  2  
car  1 
+1

您是否尝试过在大熊猫内部联接这些列? –

+5

请提供dfA和dfB样本以及预期产出。看到这篇文章[如何提问](https://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples) –

回答

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 

这一次似乎更快,小数据,但可能的扩展性。

+0

如果你打算使用理解,不要停止dfA.title.values.tolist()])这个dfA.assign(Results = [sum([x.count(y)for x in dfB.title.values.tolist()])更快。 – piRSquared

+0

@piRSquared您确定它可以扩展更大的数据吗? –

+0

尚未完成该测试。但是你的解决方案的时间复杂度是一样的。两者均按比例缩放。我的也一样!我不知道这个方法。 'O(nxm)'但是对于小数据,理解速度比str.count()。sum()'快。 – piRSquared

1

使用countufuncnumpy.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'] 
)) 
0

我先试试合并dataframes:

df = pd.merge(dfA, dfB, on = "title") 
相关问题