Pandas两个DataFrame按UWI关联后重复值格式化处理问题咨询
解决方案
方案1:多字段关联消除冗余行(优先推荐)
你提到存在Formation、Top sample depth、Bottom sample depth等公共字段,优先用这些字段和UWI组成联合关联键,从根源避免笛卡尔积生成冗余行,也符合同井同地层同深度区间样品匹配的业务逻辑:
# 使用多字段左关联,仅匹配属性完全对应的记录,不会生成多余行 joinedDF = df.merge( df1, on=['New_UWI', 'Formation', 'Top sample depth', 'Bottom sample depth'], how='left' ) joinedDF.to_csv(r'Joined_Water_Analysis_WithLithium.csv', index=False)
方案2:单UWI关联后自动置空重复字段
如果业务要求必须保留同UWI下df1的所有记录,不需要做深度、地层匹配,可以直接在关联后对df侧重复字段批量置空,实现你要的格式要求:
import pandas as pd # 统计每个UWI在df中的记录数N uwi_record_cnt = df['New_UWI'].value_counts().to_dict() # 给df添加同UWI下的行序号 df['_uwi_row_idx'] = df.groupby('New_UWI').cumcount() # 执行单UWI关联 joinedDF = df.merge(df1, on='New_UWI', how='left', suffixes=('', '_df1')) # 给关联结果添加同UWI下的全局行序号 joinedDF['_global_uwi_row'] = joinedDF.groupby('New_UWI').cumcount() # 提取df原生字段列表(排除临时辅助列) df_native_cols = [col for col in df.columns if col != '_uwi_row_idx'] # 同UWI下超过N行的记录,df侧字段全部置空 joinedDF.loc[ joinedDF['_global_uwi_row'] >= joinedDF['New_UWI'].map(uwi_record_cnt), df_native_cols ] = None # 清除临时辅助列后输出 joinedDF = joinedDF.drop(columns=['_uwi_row_idx', '_global_uwi_row']) joinedDF.to_csv(r'Joined_Water_Analysis_WithLithium.csv', index=False)
内容的提问来源于stack exchange,提问作者MarkP
相关产品推荐
相关产品推荐

