Python 按系列对数据帧进行排序,而不使用新列?

Python 按系列对数据帧进行排序,而不使用新列?,python,pandas,dataframe,Python,Pandas,Dataframe,我正试图找出最干净的方法来处理这个问题 我有一个熊猫数据框。我知道它包含x和y列,但可能包含其他列。如果它们存在,我更愿意忽略它们,让它们保持不变 作为我问题的简化版本。假设我想根据x和y之间的差异对这个数据帧进行排序 目前我做了以下工作: def排序差异(df): df=df.copy() df['xy']=abs(df.x-df.y) df=df.sort_值('xy') df=df.drop('xy') 返回df 现在这并不可怕,但它覆盖了xy。此列可能存在,也可能不存在。问题是我不知道

我正试图找出最干净的方法来处理这个问题

我有一个熊猫数据框。我知道它包含
x
y
列,但可能包含其他列。如果它们存在,我更愿意忽略它们,让它们保持不变

作为我问题的简化版本。假设我想根据
x
y
之间的差异对这个数据帧进行排序

目前我做了以下工作:

def排序差异(df):
df=df.copy()
df['xy']=abs(df.x-df.y)
df=df.sort_值('xy')
df=df.drop('xy')
返回df
现在这并不可怕,但它覆盖了
xy
。此列可能存在,也可能不存在。问题是我不知道

基于我对熊猫有限的了解,我目前的选择是:

  • 保留
    xy
    作为特殊列名
  • 使用一些凌乱的临时列名以避免冲突(
    tmp\u xy\u diff
  • 检查它是否存在,如果存在则保存,然后写回
所以我想问的是,是否有任何方法可以在不破坏表上随机列的情况下进行排序。比如,我可以使用有序序列(具有匹配索引)来定义新数据帧的顺序吗?如果我能做到这一点,性能是否明显更差

比如:

def排序差异(df):
差异=(abs(df.x-df.y)).sort_值()
返回df.变成此(差异索引)

在最后一个片段中,您可以返回类似于
df.reindex(diffs.index)
df.loc[diffs.index]
的内容。这两种方法都应该很有效。@MohamedThasinah谁说
sort\u diff
得到了一份副本?如果我编辑df而不将其重新分配给副本,我将编辑传递到的数据帧。我正在努力避免那样的副作用。Python按值传递引用,因此重新指定它会破坏引用,我不再编辑原始引用。至于
xy
。我说:
这是一个可能存在也可能不存在的专栏。问题是我不知道。
这就是全部问题所在。我不知道它是否存在。我宁愿以一种我不必知道的方式操作。@ayhan您可以使用
df.loc[diff.index]
!!!!我完全不知道!我也不知道reindex,它在我遇到的一些边缘案例中似乎很有用。如果你把它写成一个答案,我会选它为正确的。@MohamedThasinah答案和我说的差不多:
简而言之,Python总是按值传递,但每个Python变量实际上都是指向某个对象的指针,所以有时候它看起来像是通过引用传递。
这就是我说Python通过值传递引用的意思。它总是按值传递,但该值是一个引用。重新分配(
df=1
)编辑该值,并且不遵循引用。