如何在Pandas方法链中正确使用str.contains与str.split?
Pandas方法链优化:过滤行与拆分多列实现
完整可运行的链式代码
# 爬取的原始周度数据 raw_list = ['Unnamed: 0','Preseason-Aug 11','Week 1-Aug 26','Week 2-Sep 2', 'Week 3-Sep 9','Week 4-Sep 23','Week 5-Sep 30','eek 6-Oct 7','Week 7-Oct 14', 'Week 8-Oct 21','Week 9-Oct 28','Week 10-Nov 4','Week 11-Nov 11','Week 12-Nov 18', 'Week 13-Nov 25','Week 14Dec 2','Week 15-Dec 9','Week 16 (Final)-Jan 4','Unnamed: 18'] # 链式调用完成数据清洗 clean_df = (pd.DataFrame(raw_list) .rename(columns={0: "text"}) # 过滤含"Unnamed"的行 .query("~text.str.contains('Unnamed')", engine='python') # 拆分text列为week和released两列 .assign(**lambda df_: df_["text"].str.split('-', expand=True) .rename(columns={0: 'week', 1: 'released'})) )
关键问题解决说明
替代pipe+自定义函数的过滤方式
不需要额外定义过滤函数,直接用query方法就能在链式中完成行过滤:- 指定
engine='python'是因为默认的pandas查询引擎不支持str.contains这类字符串方法 - 也可以用
loc链式写法,效果完全一致:.loc[lambda df_: ~df_['text'].str.contains('Unnamed')]
- 指定
链式中实现str.split生成多列
用assign结合匿名函数+字典解包(**)的方式,把拆分后的DataFrame转换成键值对传入assign,直接生成目标列:str.split(expand=True)返回的是一个多列DataFrame,先通过rename把默认列名改为week和released- 字典解包
**会把重命名后的列名和对应数据作为参数传给assign,实现多列新增 - 如果偏好更直观的写法,也可以用
join替代assign:.join(lambda df_: df_["text"].str.split('-', expand=True) .rename(columns={0: 'week', 1: 'released'}))
内容的提问来源于stack exchange,提问作者DavidH
相关产品推荐
相关产品推荐

