如何将基于Device Type的DataFrame列乘法逻辑封装为函数?
基于设备类型生成计算列的最优实现方案
一、封装好的函数实现
这里提供三种不同风格的实现,你可以根据习惯选择:
1. 使用mask方法的封装
import pandas as pd def generate_guess(df, target_col, coeffs): # coeffs格式:{'iOS': 系数值, 'Android': 系数值} df['Guess'] = pd.NA # 初始化空值,数值列用pd.NA比pd.NaT更合适 df['Guess'] = df['Guess'].mask(df['Device Type'] == 'iOS', df[target_col] * coeffs['iOS']) df['Guess'] = df['Guess'].mask(df['Device Type'] == 'Android', df[target_col] * coeffs['Android']) return df
2. 使用loc方法的封装
def generate_guess_loc(df, target_col, coeffs): df['Guess'] = pd.NA # 直接定位iOS行赋值 df.loc[df['Device Type'] == 'iOS', 'Guess'] = df.loc[df['Device Type'] == 'iOS', target_col] * coeffs['iOS'] # 直接定位Android行赋值 df.loc[df['Device Type'] == 'Android', 'Guess'] = df.loc[df['Device Type'] == 'Android', target_col] * coeffs['Android'] return df
3. 更简洁高效的映射乘法
这种方式一行核心代码搞定,可读性和效率都不错:
def generate_guess_efficient(df, target_col, coeffs): # 把设备类型映射为对应系数,再和目标列相乘 df['Guess'] = df[target_col] * df['Device Type'].map(coeffs) return df
二、mask和loc的适用场景对比
- mask:适合基于条件替换已有值的链式操作,不用重复写布尔索引,代码更连贯。但需要先初始化列的空值,再逐步替换。
- loc:直接定位符合条件的行和列赋值,逻辑直白,新手更容易理解。如果只是给特定行赋值,跳过了先初始化再替换的步骤。
对你的1500行数据来说,两种方法的性能差异可以忽略,选哪个全看你觉得哪种代码更顺眼。另外上面的第三种映射方法,代码最简洁,推荐优先使用。
三、使用示例
# 定义不同设备的系数 device_coeffs = {'iOS': 0.333, 'Android': 0.312} # 基于DAU生成Guess列 df = generate_guess_efficient(df, 'DAU', device_coeffs) # 换成MAU生成Guess列也一样 df = generate_guess_efficient(df, 'MAU', device_coeffs)
内容的提问来源于stack exchange,提问作者B S
相关产品推荐
相关产品推荐

