如何用Python实现R中mutate()与grepl()的二进制列生成功能?
在Python中实现R的mutate+grepl生成二进制列功能(处理NaN值)
你可以用pandas结合字符串匹配功能实现和R代码完全一致的效果,同时处理installed_software列中的NaN值:
核心思路
- 用
pandas.Series.str.contains()对应R的grepl(),检测字符串中是否包含目标软件名 - 通过
na=False参数将NaN值直接判定为"未安装"(返回False,转int后为0) - 支持批量处理所有软件,避免重复代码
代码实现
首先导入依赖库:
import pandas as pd import numpy as np
方式1:批量处理(推荐,减少重复代码)
# 定义软件名称与目标列名的映射关系 software_list = { "MS_Office_installed": "MS Office", "Adobe_Acrobat_installed": "Adobe Acrobat", "Slack_installed": "Slack", "Mathcard_installed": "Mathcard", "Google_Chrome_installed": "Google Chrome" } # 遍历映射,生成每个二进制列 for col_name, software in software_list.items(): # str.contains返回布尔值,astype(int)转成1/0;na=False处理NaN值 data[col_name] = data["installed_software"].str.contains(software, na=False).astype(int)
方式2:逐列处理(和R代码结构更对应)
# 逐列生成二进制标记,np.where对应R的ifelse data["MS_Office_installed"] = np.where(data["installed_software"].str.contains("MS Office", na=False), 1, 0) data["Adobe_Acrobat_installed"] = np.where(data["installed_software"].str.contains("Adobe Acrobat", na=False), 1, 0) data["Slack_installed"] = np.where(data["installed_software"].str.contains("Slack", na=False), 1, 0) data["Mathcard_installed"] = np.where(data["installed_software"].str.contains("Mathcard", na=False), 1, 0) data["Google_Chrome_installed"] = np.where(data["installed_software"].str.contains("Google Chrome", na=False), 1, 0)
关键说明
str.contains(software, na=False):当installed_software为NaN时,直接返回False,确保最终生成的列只有1和0,不会出现NaN- 如果需要区分"NaN(无记录)"和"确实未安装",可以去掉
na=False,后续用fillna()自定义处理(比如标记为-1),但根据需求,这里用na=False刚好符合"无安装软件则为0"的要求
内容的提问来源于stack exchange,提问作者amatof
相关产品推荐
相关产品推荐

