Pandas合并CSV文件时如何按数值保留两位小数后匹配列完成合并
实现方案
核心逻辑是合并前将两个DataFrame中用于匹配的数值列统一处理为保留两位小数,基于处理后的临时列完成匹配,不会修改原始列的数值。
方案1:四舍五入保留两位小数匹配(最常用)
import pandas as pd # 为两个DataFrame生成临时匹配列,四舍五入到两位小数 df1['X_match'] = df1['X1'].round(2) df1['Y_match'] = df1['Y1'].round(2) df2['X_match'] = df2['X2'].round(2) df2['Y_match'] = df2['Y2'].round(2) # 基于临时列完成合并 merged_df = pd.merge(df1, df2, on=['X_match', 'Y_match']) # 删除不需要的临时匹配列 merged_df = merged_df.drop(columns=['X_match', 'Y_match'])
针对你给出的示例数据,处理后X列两位小数均为1.23、3.53,Y列均为2.27、5.63,可以正常匹配。
方案2:截断小数位匹配(直接忽略第三位及以后,不做四舍五入)
如果不需要四舍五入,直接截断第三位及以后的小数位,可以用以下逻辑替换上述的round代码:
# 截断到两位小数 df1['X_match'] = (df1['X1'] * 100).astype(int) / 100 df1['Y_match'] = (df1['Y1'] * 100).astype(int) / 100 df2['X_match'] = (df2['X2'] * 100).astype(int) / 100 df2['Y_match'] = (df2['Y2'] * 100).astype(int) / 100
方案3:转字符串匹配(避免浮点精度误差)
如果存在浮点精度导致的数值偏差问题,可以将处理后的数值转成固定两位小数的字符串再匹配,稳定性更高:
df1['X_match'] = df1['X1'].apply(lambda x: f"{x:.2f}") df1['Y_match'] = df1['Y1'].apply(lambda x: f"{x:.2f}") df2['X_match'] = df2['X2'].apply(lambda x: f"{x:.2f}") df2['Y_match'] = df2['Y2'].apply(lambda x: f"{x:.2f}")
内容的提问来源于stack exchange,提问作者Naveh Elya
相关产品推荐
相关产品推荐

