如何一次性对DataFrame的不同列应用不同函数?
一次性给DataFrame不同列应用不同函数的实用方法
嘿,这个问题我太熟了!每次手动逐个处理列确实挺麻烦的,其实Pandas有好几种优雅的方式能一次性完成这个操作,我结合常见场景给你演示:
首先先构造一个可复用的示例DataFrame,方便你测试:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'num_col': [1, 2, 3, 4], 'str_col': ['apple', 'banana', 'cherry', 'date'], 'float_col': [1.1, 2.2, 3.3, 4.4] })
假设你原本的逐个操作是这样的:
# 旧的逐个处理方式 df['num_col'] = df['num_col'].apply(lambda x: x * 2) df['str_col'] = df['str_col'].apply(lambda x: x.upper()) df['float_col'] = df['float_col'].apply(lambda x: round(x, 0))
下面是两种更高效的一次性处理方案:
方案1:用apply+函数映射字典
这种方法适合你已经明确知道每列要对应哪个函数的场景,先定义一个列名: 对应函数的字典,然后用apply批量处理:
# 定义列与函数的映射关系 func_mapping = { 'num_col': lambda x: x * 2, # 数值列翻倍 'str_col': lambda x: x.upper(), # 字符串列转大写 'float_col': lambda x: round(x, 0)# 浮点列取整 } # 一次性应用所有函数 df = df.apply(lambda col: func_mapping[col.name](col), axis=0)
这里的axis=0表示按列处理,col.name会自动获取当前处理的列名,然后从字典里匹配对应的函数执行。
方案2:用assign()批量赋值
assign()方法更直观,适合想要清晰看到每列处理逻辑的场景,而且支持保留原列(只需要给新列起不同名字就行):
# 一次性处理并覆盖原列(如果要保留原列,把左边的列名改成新名字即可) df = df.assign( num_col=lambda x: x['num_col'] * 2, str_col=lambda x: x['str_col'].str.upper(), float_col=lambda x: x['float_col'].round(0) )
如果想保留原列,比如生成num_col_double,只需要把num_col=改成num_col_double=就行,非常灵活。
额外技巧:只处理部分列,其他列保持不变
如果你的DataFrame有很多列,只想处理其中几列,其他列不动,可以用update()配合切片:
# 只定义需要处理的列和函数 func_mapping = { 'num_col': lambda x: x * 2, 'str_col': lambda x: x.upper() } # 只处理指定列,然后更新回原DataFrame df.update(df[list(func_mapping.keys())].apply(lambda col: func_mapping[col.name](col)))
这样未在func_mapping里的列(比如float_col)会完全保持原样。
内容的提问来源于stack exchange,提问作者AwaitedOne
相关产品推荐
相关产品推荐

