今
日
鸡
汤
劝君更尽一杯酒,西出阳关无故人。
大家好,我是Python进阶者。
一、前言
前几天在Python最强王者交流群【钟爱一生】问了一个Pandas库实战的问题。问题如下:
各位大佬,这个得到的结果怎么没按包含数量和金额的列名排序后移动到[发料仓库,1级物料类别,2级物料类别,3级物料类别,4级物料类别,5级物料类别,物料长代码,物料名称,规格型号 单位(基本),单价,仓库分类]之后顺序。
代码如下:
# 创建列名顺序列表
column_order = [
"发料仓库", "1级物料类别", "2级物料类别", "3级物料类别", "4级物料类别", "5级物料类别",
"物料长代码", "物料名称", "规格型号", "单位(基本)", "单价", "仓库分类"
]
# 提取包含数量和金额的列名
amount_and_amount_columns = [
col for col in stock_capital.columns
if "数量" in col or "金额" in col
]
# 重新排序数据框列的顺序
new_columns = column_order + amount_and_amount_columns
stock_capital = stock_capital.reindex(columns=new_columns)
二、实现过程
这里【瑜亮老师】给了一个思路:你是要包含数量和金额的列排在column_order后面,先不说列名的问题,就先说这个排序,你自己要先确定一下:"2024年1月份结存数量" ,"9月份结存金额", "2022年12月份结存数量" ,"对比10月份数量差异", "对比2022年12月份金额差异"这怎么排序。
后来修改后,就能顺利地得到预期的结果了。
column_order = ['发料仓库', '1级物料类别', '2级物料类别', '3级物料类别', '4级物料类别', '5级物料类别', '物料长代码', '物料名称', '规格型号', '单位(基本)', '单价', '仓库分类']
# 提取包含数量和金额的列
amount_and_amount_columns = [col for col in stock_capital.columns if "数量" in col or "金额" in col]
# 定义自定义排序函数
def custom_sort(col):
# 定位数字(年份和月份)
numbers = re.findall(r'\d+', col)
year = int(numbers[0]) if numbers else 0
month = int(numbers[1]) if len(numbers) > 1 else 0
# 数量或金额在排序中的权重,数量 > 金额
type_weight = -1 if "数量" in col else 0
# 对比差异的权重,对比 < 无对比
diff_weight = -1 if "对比" in col else 0
# 返回排序键
return (year, month, diff_weight, type_weight)
# 按照自定义排序函数对列名进行排序
amount_and_amount_columns_sorted = sorted(amount_and_amount_columns, key=custom_sort)
# 将已排序的列名添加到column_order列表中
column_order.extend(amount_and_amount_columns_sorted)
stock_capital = stock_capital.reindex(columns=column_order)
领取专属 10元无门槛券
私享最新 技术干货