数据分析之python处理常用复杂转置数据

发布于:2025-04-09 ⋅ 阅读:(39) ⋅ 点赞:(0)

前段时间根据需求配合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("⚠️ 未选择文件,程序退出。")


网站公告

今日签到

点亮在社区的每一天
去签到