能否将列名作为参数传入方法?Python Pandas列值替换优化
Pandas多列值替换的复用方案
问题需求
需要对Pandas DataFrame的多列执行值替换:单元格内容包含'J'时替换为'J',包含'N'时替换为'N'。当前逐列编写代码过于冗余,希望封装成可复用方法,但不清楚如何正确传入列名参数。
当前冗余代码
import pandas as pd df = pd.DataFrame({'A': ['J', 'Ja', 'N', 'N n'], 'B': ['Nö', 'Ja', 'N', 'N n'], 'C': ['Jup', 'Ja', 'N', 'N n']}) df.loc[df['A'].str.contains('J'), 'A'] = 'J' df.loc[df['A'].str.contains('N'), 'A'] = 'N' df.loc[df['B'].str.contains('J'), 'B'] = 'J' df.loc[df['B'].str.contains('N'), 'B'] = 'N' df.loc[df['C'].str.contains('J'), 'C'] = 'J' df.loc[df['C'].str.contains('N'), 'C'] = 'N'
尝试的无效代码
def clear_values(column_namestr): column_name = [column_namestr] print(type(column_name)) #df.loc[df[column_name].str.contains('X'), 'spaltennamen'] = 'X' #df.loc[df[column_name].str.contains('o'), 'spaltennamen'] = 'o' column_namestr = 'a' df2 = clear_values(column_namestr) # But does not work...
解决方案
1. 封装单列处理函数
核心要点:必须将DataFrame作为参数传入函数,函数才能操作数据;列名直接传字符串即可。
import pandas as pd df = pd.DataFrame({'A': ['J', 'Ja', 'N', 'N n'], 'B': ['Nö', 'Ja', 'N', 'N n'], 'C': ['Jup', 'Ja', 'N', 'N n']}) def clear_single_column(df, column_name): # 匹配含'J'的单元格并替换 df.loc[df[column_name].str.contains('J'), column_name] = 'J' # 匹配含'N'的单元格并替换 df.loc[df[column_name].str.contains('N'), column_name] = 'N' # 调用函数处理每一列 clear_single_column(df, 'A') clear_single_column(df, 'B') clear_single_column(df, 'C') print(df)
2. 封装多列批量处理函数
直接传入列名列表,循环处理每一列,避免多次调用函数:
def clear_multiple_columns(df, column_names): for col in column_names: df.loc[df[col].str.contains('J'), col] = 'J' df.loc[df[col].str.contains('N'), col] = 'N' # 传入需要处理的列名列表 clear_multiple_columns(df, ['A', 'B', 'C'])
3. 更高效的向量化批量处理
用正则替换或applymap实现无循环批量处理,效率更高:
方法一:正则替换
# 对指定列批量替换含J的内容 df[['A', 'B', 'C']] = df[['A', 'B', 'C']].replace(r'.*J.*', 'J', regex=True) # 批量替换含N的内容 df[['A', 'B', 'C']] = df[['A', 'B', 'C']].replace(r'.*N.*', 'N', regex=True)
方法二:applymap自定义替换逻辑
def replace_value(x): x_str = str(x) if 'J' in x_str: return 'J' elif 'N' in x_str: return 'N' else: return x # 保留既不含J也不含N的原始值 # 对指定列应用替换逻辑 df[['A', 'B', 'C']] = df[['A', 'B', 'C']].applymap(replace_value)
内容的提问来源于stack exchange,提问作者user20880339
相关产品推荐
相关产品推荐

