Pandas使用Threadpool为大型数据集排名多个列

时间:2017-04-13 15:01:59

标签: python pandas dataframe python-multithreading

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

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)

1 个答案:

答案 0 :(得分:2)

您应该能够使用pd.DataFrame.rank对每一列进行排名:

df.rank()

来自Docs

  

沿轴计算数值数据等级(1到n)。

     

轴:{0或'索引',1或'列'},默认为0

     

直接排名指数

考虑数据框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