我有一个csv格式的表格,像这样
日期 | Company1 | Company2 | Company3 | 01.01.2020 | 1, 01 | 0, 9 | 1 |
---|---|---|---|
02.01.2020 | 0, 9 | 2, 2 | 2 |
… | … | … | … |
24.10.2020 | 1, 02年 | 1, 01 | 1, 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