大家好,我是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)
如果你也有类似这种Python相关的小问题,欢迎随时来交流群学习交流哦,有问必答!
三、总结
大家好,我是皮皮。这篇文章主要盘点了一个Pandas数据处理实战的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。
最后感谢粉丝【钟爱一生】提出的问题,感谢【瑜亮老师】给出的思路,感谢【莫生气】等人参与学习交流。
【提问补充】温馨提示,大家在群里提问的时候。可以注意下面几点:如果涉及到大文件数据,可以数据脱敏后,发点demo数据来(小文件的意思),然后贴点代码(可以复制的那种),记得发报错截图(截全)。代码不多的话,直接发代码文字即可,代码超过50行这样的话,发个.py文件就行。