如何转换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
相关产品推荐
相关产品推荐

