目前我有一個資料框,我對每列的值進行排名并將它們輸出到一個新的資料框中。示例代碼如下:
df = pd.DataFrame(np.random.randint(0, 500, size=(500, 1000)), columns=list(range(0, 1000)))
ranking = pd.DataFrame(range(0, 500), columns=['Lineup'])
ranking = pd.concat([ranking, df[range(0, 1000)].rank(ascending=False, method='min')],
axis=1)
df 是值的資料框,每列標題是一個整數,每連續列增加 1。排名首先由“Lineup”以單列作為識別符號創建,然后資料幀“df”被連接并同時排名。
現在的問題是,這是最快的方法嗎?當有數萬列和數百行時,這可能比我希望的要長得多。有沒有一種方法可以使用串列理解來加快速度,或者使用某種其他方法來輸出串列、字典、資料框或其他任何我可以在以后的步驟中使用的東西。
謝謝
uj5u.com熱心網友回復:
您可以使用Numba JIT 更高效地并行計算。這個想法是并行計算每列的排名。這是結果代碼:
# Equivalent of df.rank(ascending=False, method='min')
@nb.njit('int32[:,:](int32[:,:])', parallel=True)
def fastRanks(df):
n, m = df.shape
res = np.empty((n, m), dtype=np.int32)
for col in nb.prange(m):
dfCol = -df[:, col]
order = np.argsort(dfCol)
# Compute the ranks with the min method
if n > 0:
prevVal = dfCol[order[0]]
prevRank = 1
res[order[0], col] = 1
for row in range(1, n):
curVal = dfCol[order[row]]
if curVal == prevVal:
res[order[row], col] = prevRank
else:
res[order[row], col] = row 1
prevVal = curVal
prevRank = row 1
return res
df = pd.DataFrame(np.random.randint(0, 500, size=(500, 1000)), columns=list(range(0, 1000)))
ranking = pd.DataFrame(range(0, 500), columns=['Lineup'])
ranking = pd.concat([ranking, pd.DataFrame(fastRanks(df[range(0, 1000)].to_numpy()))], axis=1)
在我的 6 核機器上,排名的計算速度大約快 7 倍。整體計算受 slow 的限制pd.concat。
您可以通過fastRanks使用“Lineup”列直接構建輸出來進一步提高整體計算的速度。必須從 Numba 函式生成的 Numpy 陣列中手動??設定資料框列的名稱。請注意,此優化要求所有列的型別相同,您的示例就是這種情況。
請注意,int32出于性能考慮,此解決方案中的等級屬于型別(因為float64此處不需要)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355015.html
上一篇:高負載資料更新架構
