You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:24:52