如何交换 python 中两列之间的值

How to interchange the values between two columns in python

假设我有一个像这样的数据框:

 S.NO Length  Width  Height   
  1    200      100    100 
  2    250      150    150
  3    200      250    170

在第 3 行,宽度大于长度,所以我想像这样交换数据集中宽度大于长度的这两个值

S.NO Length  Width  Height
  1    200      100    100     
  2    250      150    150
  3    250      200    170 

在 pandas 中是否可行,或者如果没有解决方案,实施此方案的最佳方案是什么?

正如@Ben Grossmann 所指出的,可以通过以下方式做到这一点

df[["Width", "Length"]] = np.sort(df[["Width", "Length"]])

您可以将 .loc 与条件和列列表一起使用:

cond = df['Length'] < df['Width']
cols_to_switch = ['Length', 'Width']
df.loc[cond, cols_to_switch] = df.loc[cond, cols_to_switch[::-1]].to_numpy()

输出:

>>> df
   S.NO  Length  Width  Height
0     1     200    100     100
1     2     250    150     150
2     3     250    200     170

让我们尝试 np.sort 然后赋值

df[['Length','Width']] = np.sort(df[['Length','Width']].values, axis=1)[:,::-1]
df
Out[326]: 
   S.NO  Length  Width  Height
0     1     200    100     100
1     2     250    150     150
2     3     250    200     170

因为它只有两列,所以这是一种没有排序(或 numpy)的方法。

idx = df[df['Length']<df['Width']].index
df.loc[idx,['Length','Width']] = df.loc[idx,['Width','Length']].values

完整代码:

s = '''S.NO Length  Width  Height
  1    200      100    100     
  2    250      150    150
  3    200      250    170'''
data = [line.split() for line in s.splitlines()]
df = pd.DataFrame(data[1:],columns = data[0]).astype(int)
idx = df[df['Length']<df['Width']].index
df.loc[idx,['Length','Width']] = df.loc[idx,['Width','Length']].values
print(df)

结果:

   S.NO  Length  Width  Height
0     1     200    100     100
1     2     250    150     150
2     3     250    200     170