如何对包含相同日期前缀的Pandas DataFrame列进行重新排序
如何对包含相同日期前缀的Pandas DataFrame列进行重新排序
我完全get到你的需求啦——就是想把原来按物品类别分组的列,改成按日期归类,同一日期下再按物品名称排序,同时把Branch列固定在最前面对吧?其实用简单的列名拆分和排序就能搞定,下面是具体的解决方法:
实现思路
- 先把
Branch列单独拎出来,剩下的列我们按规则排序 - 对非
Branch列,按下划线_拆分成「日期前缀」和「物品名称」两部分,排序时先按日期升序,同一日期下再按物品名称升序 - 把
Branch列放在排序后的列最前面,重新排列DataFrame的列顺序
完整代码实现
import pandas as pd # 初始化原始DataFrame df = pd.DataFrame({ 'Branch': ['Hanoi'], '20241201_Candy': [3], '20241202_Candy': [4], '20241203_Candy': [5], '20241201_Candle': [3], '20241202_Candle': [4], '20241203_Candle': [5], '20241201_Biscuit': [3], '20241202_Biscuit': [4], '20241203_Biscuit': [5]}) # 构造新的列顺序:先保留Branch,再对其他列按(日期, 物品)排序 sorted_columns = ['Branch'] + sorted( [col for col in df.columns if col != 'Branch'], key=lambda x: (x.split('_')[0], x.split('_')[1]) ) # 重新排列DataFrame的列 df2 = df[sorted_columns] # 查看结果列名 print(df2.columns) # 输出:Index(['Branch', '20241201_Biscuit', '20241201_Candle', '20241201_Candy', # '20241202_Biscuit', '20241202_Candle', '20241202_Candy', # '20241203_Biscuit', '20241203_Candle', '20241203_Candy'], # dtype='object')
代码细节解释
[col for col in df.columns if col != 'Branch']:先筛选出所有非Branch的列,只对这些列做排序处理sorted(..., key=lambda x: (x.split('_')[0], x.split('_')[1])):用split('_')拆分列名,排序时先以日期前缀为第一优先级,再以物品名称为第二优先级,这样就能完美实现你要的「同日期下物品按名排序」的效果- 最后把
Branch列放在最前面,组合成新的列顺序,用这个顺序重新索引DataFrame,就得到了符合预期的结果
这个方法还很灵活,哪怕后续新增更多日期或物品类别,都能自动适配排序规则哦~
备注:内容来源于stack exchange,提问作者hoa tran
相关产品推荐
相关产品推荐

