熊猫根据每一行的其他列的值对值进行排序

时间:2021-03-01 14:27:59

标签: pandas sorting

通常,我想根据 1 列的值对 Pandas 数据框中某些列的每个单元格进行排序,该单列存储其他列值的排名。

假设我有一个这样的数据框,chrs 有我想要排序的字符,rank 是每行的字符顺序:

import pandas as pd
import numpy as np
import string
from operator import itemgetter
letters = list(string.ascii_lowercase)
np.random.seed(0)
# generate length for each row
data = pd.DataFrame({'col0': np.random.randint(2,10,10)})
# generate random string for each row
data['chrs'] =  data.col0.apply(lambda x: ','.join(np.random.choice(letters) for i in range(x)))
# generate random rank for each row
data['rank_of_chr'] =  data.col0.apply(lambda x: np.random.choice(x,x,replace = False))
data.iloc[:,1:]
       chrs            rank_of_chr
0   v,s,e,x,g,y [2, 3, 5, 1, 4, 0]
1   y,m,b,g,h,x,o,y,r   [0, 4, 2, 3, 5, 6, 7, 1, 8]
2   f,z,n,i,j,u,t   [4, 1, 5, 0, 6, 2, 3]
3   q,t [0, 1]
4   f,p,p,a,s   [3, 0, 2, 1, 4]
5   d,y,r,t,t   [1, 4, 2, 0, 3]
6   t,o,h,a,b   [1, 2, 0, 3, 4]
7   j,z,a,k,u,x,d,l,s   [7, 5, 1, 2, 3, 8, 6, 0, 4]
8   x,c,a   [2, 0, 1]
9   a,e,v,f,g   [0, 2, 3, 4, 1]

我想根据每行的 chrs 值对 rank_of_chr 值进行排序。例如,对于第 9 行,我想要 a,g,e,v,f(a,e,v,f,g with rank [0,2,3,4,1],rank 就像 rank() 中的 sql 一样递增。

由于真实数据是 50,000,000 行,我想找到最快的方法。

我尝试过的是:

  1. 对每一行使用 itertuple,使用 for 循环遍历我要排序的每一列。
  2. 对于每一行,使用np.argsort获取排序后的chr的索引,然后使用itergetter索引chrs的原始值
  3. 我使用 dt.at[index,col_name] = new_value 就地修改数据框的值
cols_need_sort = ['chrs']
for i in data.itertuples():
    this_order = np.argsort(list(map(int, data.loc[i.Index,'rank_of_chr'])))
    for col_name in cols_need_sort:
        data.at[i.Index, col_name] = itemgetter(*this_order)(data.loc[i.Index,col_name].split(','))
data.iloc[:,1:]

有什么方法可以提高此任务的性能?

0 个答案:

没有答案