簡體   English   中英

對 Pandas Dataframe 進行采樣的最快方法?

[英]Fastest way to sample Pandas Dataframe?

首先,我想從三個數據幀(每個 150 行)中隨機抽取樣本並合並結果。 其次,我想盡可能多地重復這個過程。

對於第 1 部分,我使用以下函數:

def get_sample(n_A, n_B, n_C):
    A = df_A.sample(n = n_A, replace=False)
    B = df_B.sample(n = n_B, replace=False)
    C = df_C.sample(n = n_C, replace=False)
    return pd.concat([A, B, C])

對於第 2 部分,我使用以下行:

results = [get_sample(5,5,3) for i in range(n)] 

目前n = 50.000分析在我的 MacBook 上大約需要 1 分 40 秒。 歡迎任何有關如何提高此過程速度的建議!

PM 三個數據幀(df_A、df_B、df_C)僅在一個分類特征上有所不同。 挑戰在於我想要來自每個類別的特定數量的樣本。

使用 numpy ndarrays 應該更快,因為 pandas 本身是建立在 numpy 上的。 采樣可以通過: numpy.random.choice完成,如解釋here 這應該相當於pd.sample 然后你可以從 numpy 切換回 Pandas。

在您的情況下,使用 numpy 數組而不是 Pandas 數據幀應該是值得的(Leevo 已經指出)。

Numpy 數組是比 Pandas 數據幀更簡單的對象(numpy 數組中沒有行/列標簽就是一個主要例子)。 因此,numpy 數組允許更快地執行諸如連接之類的操作。 當您在一個較大的腳本中只執行幾個串聯時,時間差通常可以忽略不計。 但是,在您在多次迭代循環中進行串聯的情況下,時間差異可能會累積並變得顯着。

請嘗試以下操作:

import pandas as pd
import numpy as np

# Initialize example dataframes
df_A = pd.DataFrame(np.random.rand(150, 10))
df_B = pd.DataFrame(np.random.rand(150, 10))
df_C = pd.DataFrame(np.random.rand(150, 10))

# Initialize constants
n_A = 5
n_B = 5
n_C = 3
n = 10000

# Reduce dataframes to numpy arrays
arr_A = df_A.values
arr_B = df_B.values
arr_C = df_C.values

# Perform sampling on numpy arrays
def get_sample():
    A = arr_A[np.random.choice(arr_A.shape[0], n_A, replace=False)]
    B = arr_B[np.random.choice(arr_B.shape[0], n_B, replace=False)]
    C = arr_C[np.random.choice(arr_C.shape[0], n_C, replace=False)]
    return np.concatenate([A, B, C])
results = [get_sample() for i in range(n)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM