我有一個從 CSV 檔案中獲取的大約 160k 個條目的陣列,它看起來像這樣:
data_arr = np.array(['ID0524', 1.0]
['ID0965', 2.5]
.
.
['ID0524', 6.7]
['ID0324', 3.0])
我現在從某個資料庫中獲得了大約 3k 個唯一 ID,我要做的是在陣列中查找這些 ID 中的每一個,并對相應的數字求和。因此,如果我需要查找“ID0524”,則總和將為 7.7。
我當前的作業代碼看起來像這樣(對不起,它很丑,我對 numpy 很陌生):
def sumValues(self, id)
sub_arr = data_arr[data_arr[0:data_arr.size, 0] == id]
sum_arr = sub_arr[0:sub_arr.size, 1]
return sum_arr.sum()
對所有 3k ID 執行此操作大約需要大約 18 秒。
我想知道是否可能有更快的方法,因為當前的運行時間對我來說似乎有點太長了。我將不勝感激對此的任何指導和提示。謝謝!
uj5u.com熱心網友回復:
您可以嘗試使用內置的numpy方法。
numpy.intersect1d找到唯一的 ID
numpy.sum來總結它們
uj5u.com熱心網友回復:
一個方便的工具來完成你的任務是Pandas,它的分組機制。
從必要的匯入開始:
import pandas as pd
然后將data_arr轉換為 pandasonic DataFrame:
df = pd.DataFrame({'Id': data_arr[:, 0], 'Amount': data_arr[:, 1].astype(float)})
上面代碼有些復雜的原因是:
- 輸入陣列的元素是單一型別(在本例中為 object),
- 所以有必要將第二列轉換為float。
然后你就可以得到一個期望的結果單指令:
result = df.groupby('Id').sum()
對于您的資料樣本,結果是:
Amount
Id
ID0324 3.0
ID0524 7.7
ID0965 2.5
另一種方法是您可以將 CSV 檔案直接讀 入 DataFrame(請參閱read_csv方法),因此無需使用任何Numpy陣列。
優點是read_csv足夠聰明,可以分別識別每一列的資料型別,至少它能夠區分數字和字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/340812.html
上一篇:使用第二個陣列規范化兩個陣列作為規范化第一個陣列的基礎
下一篇:有人可以解釋一下這行代碼嗎?
