2017-08-31 31 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") 
相關問題