使用正则表达式识别并复制Pandas DataFrame特定行求助
解决Pandas DataFrame特定行的正则提取与拆分展开问题
看起来你想要把DataFrame里的每行文本按特定规则拆分成多行,同时保留原行内容——这个需求完全可以用正则表达式结合Pandas的explode方法实现,我来一步步给你演示怎么做。
首先,我们先还原你的示例数据:
import pandas as pd df = pd.DataFrame({ 'var1': [ 'House A and B', '2 garage + garden', 'fridges' ] })
接下来,我们需要写一个自定义函数,用来对每行的var1文本进行正则匹配和拆分,返回拆分后的元素列表。针对你给出的三种情况,我们分别处理:
import re def split_text(text): # 处理房屋的情况:匹配"House X and Y"格式 house_match = re.match(r'House (\w+) and (\w+)', text) if house_match: return [f'House {house_match.group(1)}', f'House {house_match.group(2)}'] # 处理车库+花园的情况:匹配"数字 garage + garden"格式 garage_garden_match = re.match(r'(\d+) garage \+ garden', text) if garage_garden_match: num_garages = int(garage_garden_match.group(1)) # 根据数字生成对应数量的Garage项,再追加Garden garages = [f'Garage {i+1}' for i in range(num_garages)] garages.append('Garden') return garages # 处理冰箱的情况:匹配复数形式的"fridges" if text == 'fridges': return ['fridge 1', 'fridge 2'] # 兜底:如果没有匹配到任何规则,返回原文本(可根据需求调整) return [text]
然后,我们给DataFrame新增一列var2,把每行的var1传入函数得到拆分后的列表,再用explode方法把列表展开成多行:
df['var2'] = df['var1'].apply(split_text) result_df = df.explode('var2').reset_index(drop=True)
运行这段代码后,result_df就是你想要的结果:
| var1 | var2 | |
|---|---|---|
| 0 | House A and B | House A |
| 1 | House A and B | House B |
| 2 | 2 garage + garden | Garage 1 |
| 3 | 2 garage + garden | Garage 2 |
| 4 | 2 garage + garden | Garden |
| 5 | fridges | fridge 1 |
| 6 | fridges | fridge 2 |
一些补充说明:
- 如果你的数据还有其他类似的文本模式,只需要在
split_text函数里新增对应的正则匹配逻辑即可,扩展性很强。 - 正则表达式可以根据实际数据格式调整,比如如果房屋名称包含空格或特殊字符,可以把
\w+改成更通用的\S+或者自定义字符集(比如[A-Za-z0-9 ]+)。 - 若处理超大数据集,
apply效率可能偏低,可以考虑用pandas.str.extractall结合分组拼接的方式优化,但普通规模的数据用apply完全够用。
内容的提问来源于stack exchange,提问作者Toine_zg
相关产品推荐
相关产品推荐

