如何交换 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
假设我有一个像这样的数据框:
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