我有一个包含多个列的子帧,其中第一列被视为索引.剩余的列包含我希望按绝对键排序的值,然后创建新的rabrame,以索引和排序值的列表示原始rabrame位置.如果有人能给如何用更Python 的方式来做,我非常感激.
import polars as pl
import numpy as np
df = pl.DataFrame({
"name": ["a", "b", "c", "d", "e", "f"],
"val1": [1.2, -2.3, 3, -3.3, 2.2, -1.3],
"val2": [5, 2, 2, -4, -3, -6]})
vals = df[df.columns[1:]].to_numpy()
sorted_vals = sorted(tuple(vals.reshape(-1,)), key=abs)[::-1]
data = []
for sv in sorted_vals:
i, c = int(np.where(vals==sv)[0][0]), int(np.where(vals==sv)[1][0])
data.append([sv, df[i,'name'], df.columns[1+c]])
new_df = pl.DataFrame(data=data, orient='row', schema=['val', 'name', 'col'])
print(new_df)
# shape: (12, 3)
# ┌──────┬──────┬──────┐
# │ val ┆ name ┆ col │
# │ --- ┆ --- ┆ --- │
# │ f64 ┆ str ┆ str │
# ╞══════╪══════╪══════╡
# │ -6.0 ┆ f ┆ val2 │
# │ 5.0 ┆ a ┆ val2 │
# │ -4.0 ┆ d ┆ val2 │
# │ -3.3 ┆ d ┆ val1 │
# │ … ┆ … ┆ … │
# │ 2.0 ┆ b ┆ val2 │
# │ 2.0 ┆ b ┆ val2 │
# │ -1.3 ┆ f ┆ val1 │
# │ 1.2 ┆ a ┆ val1 │
# └──────┴──────┴──────┘