如何对比两个DataFrame找出CLASS字段更新的SECURITY记录?
解决DataFrame中CLASS字段变化的SECURITY识别与结果生成问题
以下是针对需求的Python实现方案,代码简洁易懂,适配你提供的场景:
完整代码实现
import pandas as pd # ---------------------- # 1. 替换为你的实际DataFrame # ---------------------- # 前一日数据 df_prev = pd.DataFrame({ 'SECURITY': ['Sec 1', 'Sec 2', 'Sec 3', 'Sec 4'], 'CLASS': ['Stock', 'Stock', 'Bond', 'Stock'] }) # 当日数据 df_curr = pd.DataFrame({ 'SECURITY': ['Sec 1', 'Sec 2', 'Sec 3', 'Sec 4'], 'CLASS': ['Stock', 'Preferred', 'Futures Option', 'Stock'] }) # ---------------------- # 2. 合并数据并匹配SECURITY # ---------------------- # 按SECURITY合并,用后缀区分前后CLASS merged_data = pd.merge(df_prev, df_curr, on='SECURITY', suffixes=('_prev', '_curr')) # ---------------------- # 3. 筛选CLASS变化的记录 # ---------------------- changed_rows = merged_data[merged_data['CLASS_prev'] != merged_data['CLASS_curr']] # ---------------------- # 4. 生成指定格式的描述文本 # ---------------------- change_descriptions = [ f"{row['SECURITY']}已从{row['CLASS_prev']}修改为{row['CLASS_curr']}" for _, row in changed_rows.iterrows() ] # ---------------------- # 5. 输出与保存结果 # ---------------------- # 打印控制台结果 print("CLASS字段发生变化的SECURITY:") for desc in change_descriptions: print(f"- {desc}") # 保存为文本文件 with open('class_change_log.txt', 'w', encoding='utf-8') as file: file.write("CLASS字段发生变化的SECURITY:\n") for desc in change_descriptions: file.write(f"- {desc}\n") # 可选:保存为CSV(保留结构化数据) changed_rows['CHANGE_DESCRIPTION'] = change_descriptions changed_rows[['SECURITY', 'CLASS_prev', 'CLASS_curr', 'CHANGE_DESCRIPTION']].to_csv( 'class_change_log.csv', index=False, encoding='utf-8' )
示例输出
运行代码后,控制台会输出:
CLASS字段发生变化的SECURITY: - Sec 2已从Stock修改为Preferred - Sec 3已从Bond修改为Futures Option
同时会生成两个文件:
class_change_log.txt:纯文本格式的变化记录class_change_log.csv:结构化的变化数据(包含SECURITY、旧CLASS、新CLASS和描述)
注意事项
- 确保两个DataFrame的
SECURITY列没有重复值,否则合并时会出现重复行 - 如果你的数据中存在仅在某一个DataFrame中出现的SECURITY(新增/删除),可以将
pd.merge的how参数改为'outer',并额外处理这些情况
内容的提问来源于stack exchange,提问作者J3PO
相关产品推荐
相关产品推荐

