如何批量判断符号'/'前后是否存在相同整数并生成哑变量
解决方案:生成数字交集哑变量(适配大规模数据集)
Python Pandas 实现(高效处理大规模数据)
针对大规模数据集,优先使用向量化操作替代逐行循环,避免性能瓶颈。
核心思路
- 分割字符串为
/前后两部分,先去除所有空格避免干扰 - 提取两部分中的所有单个数字字符,转为集合(集合交集判断效率远高于逐个比对)
- 判断两个数字集合是否有重叠,生成对应的哑变量
代码实现
import pandas as pd import re # 模拟大规模数据集(实际可替换为读取你的数据源) data = pd.DataFrame({ 'Col 1': ['F25J2205/02', 'F33J 4416/07', 'A123/45', 'B 67 /896', 'C0/0'] }) # 提取/前的数字集合:先去空格,再提取所有数字字符转集合 data['pre_digits'] = data['Col 1'].str.split('/').str[0].str.replace(' ', '').str.findall(r'\d').apply(set) # 提取/后的数字集合:同上述逻辑 data['post_digits'] = data['Col 1'].str.split('/').str[1].str.replace(' ', '').str.findall(r'\d').apply(set) # 判断集合是否有交集,生成哑变量 data['Dummy'] = (data['pre_digits'] & data['post_digits']).astype(bool).astype(int) # 清理中间辅助列 data = data.drop(['pre_digits', 'post_digits'], axis=1) print(data)
输出结果
| Col 1 | Dummy |
|---|---|
| F25J2205/02 | 1 |
| F33J 4416/07 | 0 |
| A123/45 | 0 |
| B 67 /896 | 1 |
| C0/0 | 1 |
性能说明
Pandas的字符串向量化方法(str.split/str.findall)基于C底层实现,处理百万级以上数据集的速度比Python原生循环快10~100倍,完全适配大规模数据场景。
SQL 实现(数据存储在数据库时)
如果数据存储在数据库中,可通过正则函数+集合判断实现:
SELECT `Col 1`, CASE WHEN EXISTS ( SELECT digit FROM REGEXP_SUBSTR(`Col 1`, '[0-9]', 1, LEVEL) pre_digits CONNECT BY REGEXP_SUBSTR(`Col 1`, '[0-9]', 1, LEVEL) IS NOT NULL AND LEVEL <= LENGTH(REGEXP_REPLACE(`Col 1`, '[^0-9/]', '')) WHERE SUBSTR(`Col 1`, 1, INSTR(`Col 1`, '/')-1) LIKE '%' || digit || '%' AND SUBSTR(`Col 1`, INSTR(`Col 1`, '/')+1) LIKE '%' || digit || '%' ) THEN 1 ELSE 0 END AS Dummy FROM your_table;
注:不同SQL方言的正则函数语法不同(如MySQL用REGEXP_EXTRACT、PostgreSQL用regexp_matches),需根据数据库类型调整。
内容的提问来源于stack exchange,提问作者wilbertosilva
相关产品推荐
相关产品推荐

