我有一个输入数据框:
import pandas as pd
df = pd.DataFrame({"AX_970" : {0 : 0.7, 1 : 0.1, 2 : 0.2},
"AZ_980" : {0 : 0.2, 1 : 0.7, 2 : 0.1},
"BV_197" : {0 : 0.5, 1 : 0.2, 2 : 0.3},
"BT_980" : {0 : 0.1, 1 : 0.22, 2 : 0.7}
})
df["id"] = df.index
df.head()
AX_970 AZ_980 BT_980 BV_197 id
0 0.7 0.2 0.1 0.5 0
1 0.1 0.7 0.22 0.2 1
2 0.2 0.1 0.7 0.3 2
我需要转换此输入,如下面的输出示例所示:
(输出降序排列)
1 2 3 4 id
0 AX_970 BV_197 AZ_980 BT_980 0
1 AZ_980 BT_980 BV_197 AX_970 1
2 BT_980 BV_197 AX_970 AZ_980 2
如果您有任何想法,请分享。 非常感谢你!
答案 0 :(得分:1)
您可以将np.argsort
与pd.DataFrame.iloc
结合使用:
df.iloc[:, :-1] = df.columns[np.argsort(df.iloc[:, :-1].values, axis=1)[:, ::-1]]
df.columns[
print(df)
AX_970 AZ_980 BT_980 BV_197 id
0 AX_970 BV_197 AZ_980 BT_980 0
1 AZ_980 BT_980 BV_197 AX_970 1
2 BT_980 BV_197 AX_970 AZ_980 2
您可以按以下方式重命名列。逻辑上很冗长,因为您不应该就地更新基础数组,因为这可能会引起副作用。
arr = df.columns.values
arr[:-1] = np.arange(1, len(df.columns))
df.columns = arr
print(df)
1 2 3 4 id
0 AX_970 BV_197 AZ_980 BT_980 0
1 AZ_980 BT_980 BV_197 AX_970 1
2 BT_980 BV_197 AX_970 AZ_980 2