前段时间根据需求配合ai写了个转置excel代码,挺好用的,而且可以选择excel,不局限于excel存在哪个地方,都可以转置,但是转置后的excel记得要先创建放在转置文件的目录下。
原本的数据长这样
转置后则可以变为这样!
全代码如下,可以用jupyter运行。
import pandas as pd
import re
import os
import tkinter as tk
from tkinter import filedialog
# 1️⃣ 选择 Excel 文件
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename(title="选择要转换的Excel文件", filetypes=[("Excel files", "*.xls;*.xlsx")])
if file_path:
# 2️⃣ 读取 Excel 文件,不解析日期(防止自动转换)
df = pd.read_excel(file_path, dtype=str)
# 3️⃣ 假设前3列为 品牌、型号、平台,其余列均为日期
id_vars = df.columns[:3]
# 4️⃣ 转置数据
df_melted = df.melt(id_vars=id_vars, var_name='日期', value_name='价格')
# 5️⃣ 删除价格为空的行
df_melted.dropna(subset=['价格'], inplace=True)
# 6️⃣ 定义价格处理函数:支持“-”和“送”运算
def clean_price(price):
if pd.isna(price):
return None
# 去除括号及其内容,如 "19999(锁定)" -> "19999"
price = re.sub(r'\(.*?\)', '', str(price))
# 如果包含 "送" 则按运算处理,如 "15795送938"
if "送" in price:
parts = price.split("送")
try:
final_price = int(parts[0]) - int(parts[1])
return final_price
except:
return pd.to_numeric(parts[0], errors='coerce')
# 如果包含 "-" 则按运算处理,如 "36088-1805"
elif "-" in price:
parts = price.split("-")
try:
final_price = int(parts[0]) - int(parts[1])
return final_price
except:
return pd.to_numeric(parts[0], errors='coerce')
else:
# 否则保留数字部分
price = re.sub(r"[^\d]", "", price)
return pd.to_numeric(price, errors='coerce')
# 7️⃣ 应用价格处理函数
df_melted['价格'] = df_melted['价格'].apply(clean_price)
# 8️⃣ 强制日期列保持文本格式,去除 " 00:00:00" 并将 "-" 替换为 "/"
df_melted['日期'] = df_melted['日期'].astype(str)
df_melted['日期'] = df_melted['日期'].str.replace(" 00:00:00", "", regex=False)
df_melted['日期'] = df_melted['日期'].str.replace("-", "/")
# 9️⃣ 自动生成保存路径(与原文件同目录),文件名为 "转置后数据.xlsx"
save_path = os.path.join(os.path.dirname(file_path), "转置后数据.xlsx")
# 🔟 保存 Excel 文件
df_melted.to_excel(save_path, index=False)
print(f"✅ 数据已成功转置并保存至 {save_path}")
else:
print("⚠️ 未选择文件,程序退出。")