如何用PHP基于CSV2替换CSV1中指定匹配条件的Close列值
用Python Pandas实现CSV列替换(多条件匹配)
我来帮你搞定这个CSV列替换的需求,用Python的pandas库就能高效实现,尤其是数据量较大的时候,比手动处理或者Excel公式靠谱多了。下面是具体步骤和代码:
步骤说明
- 读取两个CSV文件,确保路径正确
- 基于指定的5个匹配列进行左连接(保留第一个CSV的所有行)
- 将第一个CSV的
CLOSE列替换为第二个CSV匹配到的LTP值 - 清理多余列并保存结果
完整代码示例
import pandas as pd # 替换成你的实际CSV文件路径 csv1_path = "your_first_csv.csv" csv2_path = "your_second_csv.csv" output_path = "updated_first_csv.csv" # 读取两个CSV文件 df1 = pd.read_csv(csv1_path) df2 = pd.read_csv(csv2_path) # 关键:多条件左连接,确保匹配列一一对应 # 左表(第一个CSV)的匹配列:SYMBOL, EXPIRY_DT, STRIKE_PR, OPTION_TYP, TIMESTAMP # 右表(第二个CSV)的匹配列:Symbol, Expiry, Strike Price, Option Type, Date merged_df = pd.merge( df1, df2, left_on=["SYMBOL", "EXPIRY_DT", "STRIKE_PR", "OPTION_TYP", "TIMESTAMP"], right_on=["Symbol", "Expiry", "Strike Price", "Option Type", "Date"], how="left" # 保留df1的所有行,未匹配到的行CLOSE列保持原值 ) # 替换CLOSE列:优先用匹配到的LTP,没有匹配则保留原CLOSE值 merged_df["CLOSE"] = merged_df["LTP"].combine_first(merged_df["CLOSE"]) # 移除合并后产生的多余列(可选,根据需求调整) columns_to_remove = ["Symbol", "Expiry", "Strike Price", "Option Type", "Date", "LTP"] merged_df = merged_df.drop(columns=columns_to_remove) # 保存处理后的结果,不保留索引列 merged_df.to_csv(output_path, index=False)
注意事项
- 日期格式一致性:如果两个CSV的日期格式不同(比如一个是
26-Apr-18,另一个是2018-04-26),需要先统一格式才能正确匹配。可以用pd.to_datetime转换:# 转换并统一日期格式为相同字符串 df1["TIMESTAMP"] = pd.to_datetime(df1["TIMESTAMP"], format="%d-%b-%y").dt.strftime("%d-%b-%y") df2["Date"] = pd.to_datetime(df2["Date"], format="%Y-%m-%d").dt.strftime("%d-%b-%y") - 列名准确性:确保匹配列的名称完全对应(包括大小写、空格),如果有差异可以先修改列名,比如
df2.rename(columns={"Symbol": "SYMBOL"}, inplace=True) - 未匹配行处理:代码中用
combine_first保留了原CLOSE值,如果需要把未匹配的行设为NaN或其他值,可以直接用merged_df["CLOSE"] = merged_df["LTP"]
如果你没有安装pandas,先执行pip install pandas即可。
内容的提问来源于stack exchange,提问作者Rusty Banks
相关产品推荐
相关产品推荐

