假設我有2個物件:
A是一個名字的串列 。
B是一個有3列的pandas框架。
對于我的應用程式,我想知道:對于A中的每個人,B中的人的串列,其中A中的人是2個最好的朋友之一。具體來說,對于A中的每個人,我想得到一個可以被計算的布林值的串列my_bool:
for current_name in A。
my_bool = (B['friend1'] == current_name) | (B['friend2'] == current_name)
[,,,其他使用my_bool的計算...] 。
該計算是有效的,但我想提高其效率。例如,當A的長度為15k,B有50k行時,計算時間非常長。
我的學費是:對于A中的每個人,回圈掃描B中的50k行,這并不高效。有沒有一種方法可以將計算矢量化,比如說,在1次中創建一個15k x 50k的矩陣all_bools(沒有回圈),然后在以后需要時讀出my_bool(作為all_bools的行)?在其他語言中,我可以實作這個想法,但在Python中我無法做到。如果這個想法也是垃圾,請隨時提出你的建議。
你可以使用pd.Series.isin方法,它隱含地將串列轉換為哈希圖,具有更高效的查找時間。
my_bool = B['friend1'].isin(A) | (B['friend2'].isin(B)
uj5u.com熱心網友回復:
你可以嘗試這樣做:
import numpy as np
import pandas as pd
A = np.array(['Bob'/span>, 'Becky'/span>, 'Mark'/span>, 'Joe'/span>, 'Zeke'/span>] )
B = pd. DataFrame([['Joe'/span>, 'Mark'/span>, 'Bob'/span>], ['Becky'/span>, 'Joe'/span>, 'Bob'/span>]。['Mark', 'Tom', 'Trisha']]。columns=['name', 'friend1', 'friend2'])
# 結果形狀是(len(A), len(B.friend1))
friend1 = np.equal(A.reshape(-1, 1), B.friend1. values)
friend2 = np.equal(A.reshape(-1, 1), B.friend2.value)
# 你最后的all_bools供以后參考。
all_bools = friend1 | friend2
#一次處理一個:
for i in range(all_bools.shape[0]) 。
my_bool = all_bools[i].
in_friends = B.loc[my_bool, 'name'].value
if in_friends.any():
print(f'My name is {A[i]} and Im friends with {in_friends})
鑒于它是numpy,它是高度矢量化和高效的。
然而......一次性創建all_bools陣列的缺點是,很有可能會消耗大量的記憶體來存盤它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/323166.html
標籤:
