如何基于两个不同时间线的CSV文件绘制产品价格变化图
CSV转DataFrame失败修复及产品价格趋势绘制方案
一、解决CSV转DataFrame失败问题
从你提供的CSV格式判断,文件大概率用**分号(;)**作为字段分隔符(而非默认逗号),或是存在编码问题。直接用以下代码尝试读取:
import pandas as pd # 替换为你的实际文件路径,指定分隔符和编码(utf-8/gbk按需调整) df_time1 = pd.read_csv("你的第一个CSV文件路径.csv", sep=";", encoding="utf-8") df_time2 = pd.read_csv("你的第二个CSV文件路径.csv", sep=";", encoding="utf-8") # 给两个数据集添加时间标识,区分不同时间线 df_time1["时间节点"] = "时间点1" df_time2["时间节点"] = "时间点2" # 合并两个数据集,保留所有产品(含重复项) combined_df = pd.concat([df_time1, df_time2], ignore_index=True)
如果仍报错,追加engine="python"参数兼容特殊格式:
df_time1 = pd.read_csv("你的第一个CSV文件路径.csv", sep=";", encoding="utf-8", engine="python")
二、绘制产品价格变化趋势图
要展示所有产品(包括重复出现的)的价格波动,以下两种方案任选:
方案1:Matplotlib基础折线图
import matplotlib.pyplot as plt # 解决中文显示乱码问题 plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False # 按产品名称分组,遍历绘制每条趋势线 for prod_name, group in combined_df.groupby("product name(产品名称)"): # 按时间节点排序,保证顺序正确 sorted_group = group.sort_values("时间节点") # 绘制常规价、折扣价、会员价三条线 plt.plot(sorted_group["时间节点"], sorted_group["normal price(常规价格)"], marker="o", label=f"{prod_name} - 常规价") plt.plot(sorted_group["时间节点"], sorted_group["discount price(折扣价格)"], marker="s", label=f"{prod_name} - 折扣价") plt.plot(sorted_group["时间节点"], sorted_group["card price(会员价格)"], marker="^", label=f"{prod_name} - 会员价") plt.title("产品价格变化趋势") plt.xlabel("时间节点") plt.ylabel("价格") # 图例放图外避免遮挡 plt.legend(bbox_to_anchor=(1.05, 1), loc="upper left") plt.tight_layout() plt.show()
方案2:Seaborn美观分组图
import seaborn as sns # 将宽表转长表,适配Seaborn的分组逻辑 melted_df = combined_df.melt( id_vars=["product name(产品名称)", "时间节点"], value_vars=["normal price(常规价格)", "discount price(折扣价格)", "card price(会员价格)"], var_name="价格类型", value_name="价格" ) plt.figure(figsize=(12, 6)) sns.lineplot( data=melted_df, x="时间节点", y="价格", hue="product name(产品名称)", style="价格类型", marker="o" ) plt.title("各产品不同价格类型的变化趋势") plt.xlabel("时间节点") plt.ylabel("价格") plt.legend(bbox_to_anchor=(1.05, 1), loc="upper left") plt.tight_layout() plt.show()
额外处理提示
- 如果时间节点是具体日期,转成日期格式确保排序正确:
combined_df["时间节点"] = pd.to_datetime(combined_df["时间节点"])
- 若价格列带货币符号(如¥),先清洗转数值:
# 以常规价为例,其他价格列同理 combined_df["normal price(常规价格)"] = combined_df["normal price(常规价格)"].str.replace("¥", "").astype(float)
内容的提问来源于stack exchange,提问作者MATIAS IGNACIO OLIVA ALCAYAGA
相关产品推荐
相关产品推荐

