在Pandas中按问号(?)拆分列并筛选含问号行的求助
问题解决方法
1. 筛选包含问号的行
你的str.contains("?")无法正常工作,是因为?在正则表达式里是特殊元字符(表示匹配前一个字符0或1次),需要转义或者关闭正则匹配模式:
- 方法一(转义正则):
filtered_data = data[data['url'].str.contains(r"\?")]
- 方法二(关闭正则模式):
filtered_data = data[data['url'].str.contains("?", regex=False)]
2. 按问号拆分URL为两列
你原来的data['url'].str.split('?')[1]错误在于直接对整个Series取索引,而不是对每个字符串元素的拆分结果取索引。正确的做法有两种:
方法一:直接拆分并展开为新列
先筛选目标行,再用expand=True把拆分结果直接转换成两列:
# 先筛选 filtered_data = data[data['url'].str.contains("?", regex=False)] # 拆分,n=1确保只按第一个问号拆分(避免多个问号的情况) filtered_data[['path', 'params']] = filtered_data['url'].str.split('?', expand=True, n=1)
方法二:逐个提取拆分后的部分
如果不需要直接生成新列,也可以单独提取每个部分:
# 提取问号前的路径 filtered_data['path'] = filtered_data['url'].str.split('?').str[0] # 提取问号后的参数 filtered_data['params'] = filtered_data['url'].str.split('?').str[1]
完整示例代码
假设你的DataFrame是data,列名为url,完整流程代码如下:
import pandas as pd # 示例数据 data = pd.DataFrame({'url': ['/a/b/c?abc=0', 'd/e/f', '/x/y/z?foo=1&bar=2']}) # 筛选含问号的行 filtered_data = data[data['url'].str.contains("?", regex=False)] # 拆分生成新列 filtered_data[['path', 'params']] = filtered_data['url'].str.split('?', expand=True, n=1) print(filtered_data)
运行后输出:
url path params 0 /a/b/c?abc=0 /a/b/c abc=0 2 /x/y/z?foo=1&bar=2 /x/y/z foo=1&bar=2
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

