【问题标题】:How to sort values in pandas based on a column that has repeating values如何根据具有重复值的列对熊猫中的值进行排序
【发布时间】:2021-10-24 03:36:35
【问题描述】:

我有以下数据框:

           name_1  name_2   Temp      x1   x2  
0           a        b     293.35     0.0  1.0  
0           a        b     293.35     0.5  0.5  
0           a        b     293.35     1.0  0.0  
0           a        b     295.35     0.0  1.0  
0           a        b     295.35     0.5  0.5  
0           a        b     295.35     1.0  0.0  
0           a        b     297.35     0.0  1.0  
0           a        b     297.35     0.5  0.5  
0           a        b     297.35     1.0  0.0 
1           c        d     294.35     0.0  1.0  
1           c        d     294.35     0.5  0.5  
1           c        d     294.35     1.0  0.0  
1           c        d     296.35     0.0  1.0  
1           c        d     296.35     0.5  0.5  
1           c        d     296.35     1.0  0.0  
1           c        d     299.35     0.0  1.0  
1           c        d     299.35     0.5  0.5  
1           c        d     299.35     1.0  0.0
2           a        c     300.35     0.0  1.0  
2           a        c     305.35     0.5  0.5  
2           a        c     310.35     1.0  0.0

我想安排数据,使 Temp 基于 x1 和 x2 重复以获得此:

           name_1 name_2   Temp       x1   x2  
0           a        b     293.35    0.0  1.0 
0           a        b     295.35    0.0  1.0  
0           a        b     297.35    0.0  1.0  
0           a        b     293.35    0.5  0.5  
0           a        b     295.35    0.5  0.5  
0           a        b     297.35    0.5  0.5 
0           a        b     293.35    1.0  0.0  
0           a        b     295.35    1.0  0.0  
0           a        b     297.35    1.0  0.0
1           c        d     294.35    0.0  1.0  
1           c        d     296.35    0.0  1.0  
1           c        d     299.35    0.0  1.0  
1           c        d     294.35    0.5  0.5  
1           c        d     296.35    0.5  0.5  
1           c        d     299.35    0.5  0.5  
1           c        d     294.35    1.0  0.0  
1           c        d     296.35    1.0  0.0  
1           c        d     299.35    1.0  0.0
2           a        c     300.35    0.0  1.0  
2           a        c     305.35    0.5  0.5  
2           a        c     310.35    1.0  0.0

我使用以下方法接近了:

df['new'] = df.groupby('Temp')['Temp'].cumcount()
df.sort_values(by=['new', 'Temp', "name_1", "name_2"])

这段代码产生:

           name_1 name_2    Temp       x1   x2  
0           a        b     293.35     0.0  1.0 
1           c        d     294.35     0.0  1.0  
0           a        b     295.35     0.0  1.0  
2           a        c     300.35     0.0  1.0  

问题在于 TRange 没有像所需的输出那样根据 name_1 和 name_2 重复。

【问题讨论】:

  • 你根本不需要groupby。只需使用sort_values
  • df.sort_values(by='x1')?
  • 它不能单独工作。
  • 您能详细说明一下吗?这怎么行不通?
  • 为什么不起作用?它会按预期提供您粘贴的输出。

标签: python pandas dataframe sorting


【解决方案1】:

x1 值排序,然后使用kind='mergesort' 按索引排序,以确保您的值保持排序:

>>> df.sort_values('x1', kind='mergesort').sort_index(kind='mergesort')

  name_1 name_2    Temp   x1   x2
0      a      b  293.35  0.0  1.0
0      a      b  295.35  0.0  1.0
0      a      b  297.35  0.0  1.0
0      a      b  293.35  0.5  0.5
0      a      b  295.35  0.5  0.5
0      a      b  297.35  0.5  0.5
0      a      b  293.35  1.0  0.0
0      a      b  295.35  1.0  0.0
0      a      b  297.35  1.0  0.0
1      c      d  294.35  0.0  1.0
1      c      d  296.35  0.0  1.0
1      c      d  299.35  0.0  1.0
1      c      d  294.35  0.5  0.5
1      c      d  296.35  0.5  0.5
1      c      d  299.35  0.5  0.5
1      c      d  294.35  1.0  0.0
1      c      d  296.35  1.0  0.0
1      c      d  299.35  1.0  0.0
2      a      c  300.35  0.0  1.0
2      a      c  305.35  0.5  0.5
2      a      c  310.35  1.0  0.0

【讨论】:

  • 是的,这非常接近,但它仍然需要同时基于 name_1 和 name_2,因为存在 name_1 = a & name_2 = c 的行(未在问题中显示),最终会搞砸命令。当我使用相同的代码并“添加 name_2”时,它会恢复为原始表单。
  • 您的索引是否相关?是否可以使用它(0,0,0,0,..,1,1,1,1...2,2,2,2)?其实如果我能用的话,这个和groupby_cumcount是一样的。
  • 是的,索引是用来将name_1和name_2组合在一起的。
【解决方案2】:

只需对 x1 进行排序。你可以指定一个稳定的排序算法:

df = df.sort_values(by='x1', kind='mergesort')

分组和应用 cumcount 只不过是保持其他参数的原始顺序,而稳定的排序算法已经在这样做了。

参见。 sort_values 文档供参考。

【讨论】:

  • 这很接近,但问题是其他 name_1 (ie=c) 和 name_2 (ie =d) 的 x1 也为 0.0,因此它最终会拆分数据,使得一旦所有 x1 = 0 完成,对于 name_1 =a 和 name_2 = b 开始 x1 = 0.5
  • @mozway。 kind='mergesort' 的想法显然是你的。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2020-10-21
  • 2022-07-19
  • 2019-01-29
  • 2013-12-15
  • 2022-11-30
相关资源
最近更新 更多