如何用函数或循环简化Python中重复的DataFrame值替换代码?
简化后的代码方案
首先,我们可以用函数封装重复提取逻辑+字典批量替换的方式,把你的代码大幅简化,同时完全保留原逻辑:
# 定义通用函数:获取某列去重后的前N小值(默认取前7个) def get_top_n_smallest_unique(column, n=7): return column.drop_duplicates().nsmallest(n).tolist() # ----------------处理value_bucket_min列---------------- # 提取df1和df2中该列的去重前7小值 df1_min_list = get_top_n_smallest_unique(df1['value_bucket_min']) df2_min_list = get_top_n_smallest_unique(df2['value_bucket_min']) # 构建替换字典:df1的值对应df2的同位置值 min_replace_dict = dict(zip(df1_min_list, df2_min_list)) # 批量替换 df1['value_bucket_min'] = df1['value_bucket_min'].replace(min_replace_dict) # ----------------处理value_bucket_max列---------------- df1_max_list = get_top_n_smallest_unique(df1['value_bucket_max']) df2_max_list = get_top_n_smallest_unique(df2['value_bucket_max']) max_replace_dict = dict(zip(df1_max_list, df2_max_list)) df1['value_bucket_max'] = df1['value_bucket_max'].replace(max_replace_dict)
为什么这样写更优?
- 干掉重复代码:把重复的
drop_duplicates().nsmallest()逻辑封装成函数,以后要调整取前N个值(比如改成前5个),只需要改函数的n参数就行。 - 批量替换更高效:用
dict(zip())把df1和df2的对应值做成映射字典,一次调用replace()就能完成所有替换,比你原来多次调用replace()简洁得多,也减少出错概率。 - 逻辑完全匹配原代码:原代码里
nsmallest(k).iloc[-1]是取第k小的去重值,而nsmallest(7)返回的列表正好是第1到第7小的顺序,所以用zip配对完全对应你原来的替换逻辑。
如果想再精简一步,还可以把列的处理用循环封装,进一步干掉重复:
def get_top_n_smallest_unique(column, n=7): return column.drop_duplicates().nsmallest(n).tolist() # 遍历需要处理的两列 for col_name in ['value_bucket_min', 'value_bucket_max']: df1_vals = get_top_n_smallest_unique(df1[col_name]) df2_vals = get_top_n_smallest_unique(df2[col_name]) replace_dict = dict(zip(df1_vals, df2_vals)) df1[col_name] = df1[col_name].replace(replace_dict)
内容的提问来源于stack exchange,提问作者Elena
相关产品推荐
相关产品推荐

