同时在两列上自定义排序熊猫

时间:2019-07-29 07:03:43

标签: python pandas sorting dataframe

我有一个像这样的数据框:

              id        A         B       Percentage
    1       3333311   12 days   6 days    0.41
    3953    3455572   35 days   31 days   0.36
    46458   6464544   36 days   33 days   0.36
    39378   2323322   56 days   46 days   0.42
    115880  2222111   54 days   44 days   0.25
    115882  4333311   44 days   16 days   0.56
    118882  5454566   56 days   41 days   0.25
    118884  3321767   54 days   42 days   0.42

我想先按百分比对它进行排序。

然后,当抢七局出现时,它应该同时在A和B上进行排序

     if A.iloc[1] < A.iloc[2]
      and B.iloc[1] < B.iloc[2]
then df.iloc[2] should come first and vice versa.


But      if A.iloc[1] < A.iloc[2]
         and B.iloc[1] > A.iloc[2]

    or   if A.iloc[1] > A.iloc[2]
         and B.iloc[1] < A.iloc[2]

预期的输出将如下所示:

     id        A          B       Percentage

115882 4333311 44​​天16天0.56 39378 2323322 56天46天0.42 118884 3321767 54天42天0.42 1 3333311 12天6天0.41 46458 6464544 36天33天0.36 3953 3455572 35天31天0.36 118882 5454566 56天41天0.25 115880 2222111 54天44天0.25

现在在0.25%抢七局中,情况是:              如果A.iloc [118882]> A.iloc [115880]              和B.iloc [118882]

在这里,我们将执行其他操作并考虑其他汇总。

2 个答案:

答案 0 :(得分:0)

这是我的建议,

df = pd.DataFrame({'id':[3333311,3455572,6464544,2323322,2222111],'A':['43 days','44 days','44 days','44 days','45 days'],'B':['9 days','13 days','8 days','7 days','8 days'],'Percentage':[0.044342,0.053222,0.052442,0.044342,0.052632]})

# removing 'days' string from columns
df.A = df.A.apply(lambda x: x.split()[0])
df.B = df.B.apply(lambda x: x.split()[0])

# sorting by values
df.sort_values(by='Percentage').sort_values(by='A').sort_values(by='B')

最终输出: Out[1]: id A B Percentage 1 3455572 44 13 0.053222 3 2323322 44 7 0.044342 2 6464544 44 8 0.052442 4 2222111 45 8 0.052632 0 3333311 43 9 0.044342

答案 1 :(得分:0)

您可以将排序和要执行的操作分为两个不同的步骤。

获取排序的数据框为:

sorted_df = df.sort_values(['Percentage', 'A', 'B'])

但是要根据条件执行所需的操作,请仅基于百分比排序。创建另一个数组perc_prev,其中包含上一列的值,并使用它来查找领带的索引

df_perc_sorted = df.sort_values('Percentage')
perc_prev = np.hstack(([-1], df['Percent'].values[1:]))
# use the boolean value in the tie array to figure out if there was a tie
tie = perc_prev == df['Percetange']
# similarly create boolean columns to figure out the condition you need