You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何转换Pandas DataFrame以展示用户各属性变更前后数据?

解决方法

你当前的表格是将每个用户的"Before"和"After"数据分两行存储,这种场景下用pandas.compare不是最适配的方式,更高效的处理路径是拆分-合并-重塑:

步骤1:构造初始DataFrame

先把你提供的表格转换成Pandas数据结构:

import pandas as pd

data = {
    "User ID": [1, 2, 1, 2],
    "Name": ["Steve", "John", "Stevy", "John"],
    "Favorite": ["Chocolate", "Chocolate", "Chocolate", "Vanilla"],
    "Status": ["Before", "Before", "After", "After"]
}
df = pd.DataFrame(data)

步骤2:拆分并合并前后数据

将"Before"和"After"数据集拆分后,按User ID合并:

# 拆分前后数据并去掉Status列
df_before = df[df["Status"] == "Before"].drop("Status", axis=1).set_index("User ID")
df_after = df[df["Status"] == "After"].drop("Status", axis=1).set_index("User ID")

# 合并为宽格式,用后缀区分前后值
merged_df = df_before.join(df_after, lsuffix="_Before", rsuffix="_After").reset_index()

步骤3:重塑为目标长格式

通过melt和pivot转换为按属性展示的结构:

# 先转成包含所有属性和对应值的长格式
result_df = merged_df.melt(
    id_vars="User ID",
    var_name="Attribute",
    value_name="Value"
)

# 拆分属性名和前后标识
result_df[["Attribute Changed", "Type"]] = result_df["Attribute"].str.split("_", expand=True)

# 转成最终的宽格式,提取Before和After列
final_df = result_df.pivot(
    index=["User ID", "Attribute Changed"],
    columns="Type",
    values="Value"
).reset_index().rename_axis(None, axis=1)

步骤4:可选:剔除无变更行

如果不需要展示前后值一致的行,直接过滤:

final_df = final_df[final_df["Before"] != final_df["After"]]

执行完上述代码后,final_df会生成你期望的格式(保留无变更行则完全匹配你给出的期望表格,剔除后仅展示有变化的记录)。

内容的提问来源于stack exchange,提问作者Yisroel Len

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:23:26