使用列值的函数对pandas DataFrame进行排序

Ohu*_*nen 14 python sorting dataframe pandas

基于python,使用pandas对降序数据进行排序:

鉴于:

from pandas import DataFrame
import pandas as pd

d = {'one':[2,3,1,4,5],
     'two':[5,4,3,2,1],
     'letter':['a','a','b','b','c']}

df = DataFrame(d)
Run Code Online (Sandbox Code Playgroud)

df然后看起来像这样:

df:
      letter  one  two
    0      a    2    5
    1      a    3    4
    2      b    1    3
    3      b    4    2
    4      c    5    1
Run Code Online (Sandbox Code Playgroud)

我希望有类似的东西:

f = lambda x,y: x**2 + y**2
test = df.sort(f('one', 'two'))
Run Code Online (Sandbox Code Playgroud)

这应该按照"一"和"二"列的平方值之和对整个数据帧进行排序,并给我:

test:
      letter  one  two
    2      b    1    3
    3      b    4    2
    1      a    3    4
    4      c    5    1
    0      a    2    5
Run Code Online (Sandbox Code Playgroud)

升序或降序无关紧要.有一个很好而简单的方法吗?我还没找到解决方案.

ayh*_*han 20

您可以创建要在排序中使用的临时列,然后将其删除:

df.assign(f = df['one']**2 + df['two']**2).sort_values('f').drop('f', axis=1)
Out: 
  letter  one  two
2      b    1    3
3      b    4    2
1      a    3    4
4      c    5    1
0      a    2    5
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是最好的方法,但是有点糟……将lambda函数传递给sort_values会更优雅,就像您对python的原生sorted()调用一样 (5认同)
  • @AlexSpangher,看起来我们暂时还没有支持此功能,2020 年 2 月:-( (2认同)

and*_*dge 10

df.loc[(df.x ** 2 + df.y ** 2).sort_values().index]
Run Code Online (Sandbox Code Playgroud)

如何按字符串索引上的自定义顺序对熊猫数据框进行排序之后

  • 这确实看起来是正确的方法,另一方面,您应该使用 `.loc` 而不是 `.iloc`,因为这不适用于大多数索引(它只适用于像 `list(range(n)) 这样的索引`.为了以防万一,我将添加一个替代方案。 (2认同)