我有这样的数据框切片,我想按人和购买日期对值进行排序,然后所有其他列都会自动升序排序。
df = pd.DataFrame({'person': [1, 1, 1, 2, 3, 3],
'brand': ['b', 'a', 'a', 'b', 'a', 'b'],
'product': ['A1', 'A1', 'A2', 'B1', 'C1', 'C2'],
'buydate': ['20220101', '20220101', '20220401', '20220601', '20220630', '20221201'],
'type': ['2', '1', '1', '1', '1', '2'],
'price': [50, 20, 200, 300, 20, 150],})
我期望:
人 | 品牌 | 产品 | 购买日期 | 类型 | 价格 | |
---|---|---|---|---|---|---|
0 | 1 | a | A1 | 20220101 | 1 | 20 |
1 | 1 | b | A1 | 20220101 | 2 | 50 |
2 | 1 | a | A2 | 20220401 | 1 | 200 |
3 | 2 | b | B1 | 20220601 | 1 | 300 |
4 | 3 | a | C1 | 20220630 | 1 | 20 |
5 | 3 | b | C2 | 20221201 | 2 | 150 |
我已经尝试过了
df = df.sort_values(['person', 'buydate'])
但我只得到:
人 | 品牌 | 产品 | 购买日期 | 类型 | 价格 | |
---|---|---|---|---|---|---|
0 | 1 | b | A1 | 20220101 | 2 | 50 |
1 | 1 | a | A1 | 20220101 | 1 | 20 |
2 | 1 | a | A2 | 20220401 | 1 | 200 |
3 | 2 | b | B1 | 20220601 | 1 | 300 |
4 | 3 | a | C1 | 20220630 | 1 | 20 |
5 | 3 | b | C2 | 20221201 | 2 | 150 |
我的数据集非常大并且包含很多列,因此如果有任何运行时间短的解决方案,我们将非常感激。虽然使用 lambda 需要太多时间,但也欢迎任何使用 lambda 的解决方案!
非常感谢!
您可以使用以下方法制作排序列表:
cols = ['person', 'brand']
out = df.sort_values(by=cols+list(df.columns.difference(cols)))
输出:
person brand product buydate type price
1 1 a A1 20220101 1 20
2 1 a A2 20220401 1 200
0 1 b A1 20220101 2 50
3 2 b B1 20220601 1 300
4 3 a C1 20220630 1 20
5 3 b C2 20221201 2 150