Pandas 使用线程池对大型数据集的多列进行排名

Pandas Rank Multiple Columns for huge dataset using Threadpool

我需要对数据框的每一列进行排名。我目前正在使用以下代码:

for x in range(1,len(cols)):
    data[cols[x]] = data[cols[x]].rank(ascending=0)

这适用于小型数据集。我有超过 50,000 列和 20,000 行。有没有一种方法可以让我使用 Threadpool 更快地实现目标。尝试了下面的代码,但它没有用。它正在返回空集。

cols = rankDset.columns.tolist()

def rank_columns(c):
    rankDset[c] = rankDset[c].rank(ascending=0)

def parallelDataframe(df, func):

    pool = Pool(8)
    pool.map(func, cols)
    pool.close()
    pool.join()


parallelDataframe(rankDset, rank_columns)

您应该能够使用 pd.DataFrame.rank:

对每一列进行排名
df.rank()

来自Docs

Compute numerical data ranks (1 through n) along axis.

axis: {0 or ‘index’, 1 or ‘columns’}, default 0

index to direct ranking

考虑数据框 df

np.random.seed([3,1415])
df = pd.DataFrame(dict(
        A=np.random.choice(np.arange(10), 5, False),
        B=np.random.choice(np.arange(10), 5, False),
        C=np.random.choice(np.arange(10), 5, False),
        D=np.random.choice(np.arange(10), 5, False),
    ))

df

   A  B  C  D
0  9  1  6  0
1  4  3  8  2
2  5  5  9  6
3  1  9  7  1
4  7  4  3  9

然后排名产生

df.rank()

     A    B    C    D
0  5.0  1.0  2.0  1.0
1  2.0  2.0  4.0  3.0
2  3.0  4.0  5.0  4.0
3  1.0  5.0  3.0  2.0
4  4.0  3.0  1.0  5.0