Python -对表中每行的值进行排序,并在每行中按排序顺序获得具有原始列索引/标签的新Pandas数据框



我有一个csv格式的表格,像这样

tbody> <<tr>
日期 Company1 Company2 Company3
01.01.20201, 010, 91
02.01.20200, 92, 22
24.10.20201, 02年1, 011, 03年

您可以在每行上使用.apply()按降序排序值并获得排序序列的索引(即列标签):

df2 = (df.set_index('Date')[['Company1', 'Company2', 'Company3']]
.replace(r',', r'.', regex=True)
.astype(float)
.apply(lambda x: x.sort_values(ascending=False).index.tolist(), axis=1, result_type='expand')
.pipe(lambda x: x.set_axis(x.columns+1, axis=1))
.reset_index()
)

结果:

print(df2)

Date         1         2         3
0  01.01.2020  Company1  Company3  Company2
1  02.01.2020  Company2  Company3  Company1
2  24.10.2020  Company3  Company1  Company2

您可以使用重塑使用melt,sort_values和创建一个辅助列,然后形状回到原来的辅助列作为列名:

(df.melt(id_vars='Date')
.sort_values(by='value', ascending=False)
.assign(col=lambda d: d.groupby('Date').cumcount().add(1))
.pivot(index='Date', columns='col', values='variable')
)

输出:

col                1         2         3
Date                                    
01.01.2020  Company1  Company3  Company2
02.01.2020  Company2  Company3  Company1
24.10.2020  Company3  Company1  Company2

使用np.argsort的一种方法

# get column names
columns = df.columns[1:].to_numpy()
# get sorted indices
indices = np.argsort(df.iloc[:, 1:] * -1, axis=1)
# create new DataFrame
res = pd.concat([df["Date"], pd.DataFrame(columns[indices], columns=range(1, 4))], axis=1)
print(res)

Date         1         2         3
0  01.01.2020  Company1  Company3  Company2
1  02.01.2020  Company2  Company3  Company1
2  24.10.2020  Company3  Company1  Company2

相关内容

  • 没有找到相关文章

最新更新