如何用Pandas实现混合类型数据的数值化转换(替代R方案)
用Pandas实现混合类型数据集的数值转换并保留字符信息
当然可行!咱们可以完全复刻你原R代码的逻辑,用Pandas实现一模一样的效果,下面我一步步拆解给你看:
第一步:准备环境和原始数据
首先导入Pandas,然后还原你提供的原始数据集:
import pandas as pd # 构造原始数据 dat = pd.DataFrame({ 'x': ['No Data', '2', 'Testing', 'Offline'], 'y': ['2', 'No Data', '4', 'Testing'], 'z': [1, 2, 3, 6] })
这对应你R代码里初始化dat的部分,生成的原始数据和你提供的完全一致。
第二步:定义需要处理的列
和R里的select_cols一样,先指定要处理的字符列:
select_cols = ['x', 'y']
第三步:创建字符信息的指示列
原R代码里用str_detect生成标记列(比如x_no_data),在Pandas里我们可以用str.contains来实现,同时转成数值型的0/1:
# 标记"No Data"的列 for col in select_cols: dat[f'{col}_no_data'] = dat[col].str.contains('No Data', na=False).astype(int) # 标记"Offline"的列 for col in select_cols: dat[f'{col}_offline'] = dat[col].str.contains('Offline', na=False).astype(int) # 标记"Testing"的列 for col in select_cols: dat[f'{col}_testing'] = dat[col].str.contains('Testing', na=False).astype(int)
这里的str.contains对应R的str_detect,astype(int)把布尔值转成1/0,和R里的as.numeric效果一致。
第四步:将原列转换为数值型
接下来把原列里的特殊字符串替换成'0',再转成数值类型,对应R里的str_replace和as.numeric:
# 替换特殊字符串为'0' dat[select_cols] = dat[select_cols].replace(['No Data', 'Offline', 'Testing'], '0') # 转换为数值型 dat[select_cols] = dat[select_cols].astype(int)
这里用replace批量替换多个值,比循环更高效,然后转成int类型完成数值转换。
第五步:查看最终结果
运行完上面的代码后,打印dat就能得到你想要的预处理后数据:
print(dat)
输出结果和你提供的预处理后数据完全一致:
x y z x_no_data y_no_data x_offline y_offline x_testing y_testing 0 0 2 1 1 0 0 0 0 0 1 2 0 2 0 1 0 0 0 0 2 0 4 3 0 0 0 0 1 0 3 0 0 6 0 0 1 0 0 1
补充说明
如果你想追求更高效的批量操作(类似R data.table的.SD方式),也可以用apply来简化指示列的创建,比如:
# 批量创建指示列 for keyword in ['No Data', 'Offline', 'Testing']: col_suffix = keyword.lower().replace(' ', '_') dat[[f'{col}_{col_suffix}' for col in select_cols]] = dat[select_cols].apply(lambda x: x.str.contains(keyword, na=False)).astype(int)
这段代码和之前的循环效果一样,但能减少重复代码,适合后续扩展更多关键词的场景。
内容的提问来源于stack exchange,提问作者user2340706
相关产品推荐
相关产品推荐

