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
)编辑该值,并且不遵循引用。