【问题标题】:Custom sort on two columns simultaneously Pandas同时对两列进行自定义排序 Pandas
【发布时间】:2019-12-06 11:42:03
【问题描述】:

我有一个这样的数据框:

df = pd.DataFrame({'id':[3333311,3455572,6464544,2323322,2222111,4333311,5454566,3321767],'A':['12 days','35 days','36 days','56 days','54 days','44 days','56 days','54 days'],'B':['6 days','31 days','33 days','46 days','44 days','16 days','41 days','42 days'],'Percentage':[0.41,0.36,0.36,0.42,0.25,0.56,0.25,0.42]})

              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 days   16 days   0.56
39378   2323322   56 days   46 days   0.42
118884  3321767   54 days   42 days   0.42
1       3333311   12 days   6 days    0.41
46458   6464544   36 days   33 days   0.36
3953    3455572   35 days   31 days   0.36
118882  5454566   56 days   41 days   0.25
115880  2222111   54 days   44 days   0.25

现在在 0.25% 的决胜局中,有以下条件: 如果 A.iloc[118882] > A.iloc[115880] 和 B.iloc[118882]

这里我们将执行其他操作并考虑其他聚合。

我们可以通过带 cmp 参数的 sorted 函数来做到吗?

【问题讨论】:

  • 请显示预期输出
  • @DeepSpace 我已经编辑了我的查询。现在你可以检查了。

标签: python pandas sorting dataframe


【解决方案1】:

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

将排序后的数据框获取为:

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  

【讨论】:

  • 嘿,你收到了吗?
【解决方案2】:

这就是我的建议,

# 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 = df.sort_values(by='B').sort_values(by='A').sort_values(by='Percentage', ascending=False)

# adding in 'days' string back to the values of col A & col B
df.A = df.A.apply(lambda x: str(x)+' days')
df.B = df.B.apply(lambda x: str(x)+' days')

print(df)
        id        A        B  Percentage
5  4333311  44 days  16 days        0.56
7  3321767  54 days  42 days        0.42
3  2323322  56 days  46 days        0.42
0  3333311  12 days   6 days        0.41
1  3455572  35 days  31 days        0.36
2  6464544  36 days  33 days        0.36
4  2222111  54 days  44 days        0.25
6  5454566  56 days  41 days        0.25

【讨论】:

  • 谢谢。实际上我已经改变了数据框并且也给出了预期的输出。现在可以调查一下吗?
  • @user9419602 我做了更改,现在检查一下
  • 抢七来临时如何申请条件。
  • 这有什么线索吗?
猜你喜欢
  • 2021-12-01
  • 2022-11-29
  • 2019-06-09
  • 2021-08-27
  • 1970-01-01
  • 2014-06-10
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多