如何在np.select()的choices中用df.str.extract()生成条件列?
Fixing np.select() with str.extract() in Pandas
我来帮你搞定这个问题!你遇到的两个问题其实都和np.select的参数要求以及str.extract的返回类型有关,咱们一步步拆解解决:
问题根源
- KeyError: 'new':
df['column1'].str.extract('--(.*)--')返回的是一个单列DataFrame,而np.select处理后会返回二维数组,直接赋值给df['new'](需要一维数据)就会触发KeyError,因为Pandas无法把二维结构直接放进一个列里。 - 所有行都显示extract_text:你提前初始化
df['new']='a'后,再用错误的np.select结果赋值时,由于choices是二维的DataFrame,它会被广播覆盖所有行,加上你没给np.select指定默认值,导致条件不满足的行也被错误赋值。
正确实现代码
只要做两个关键调整就能达到你想要的效果:
- 把
str.extract的结果转成一维Series(通过取提取后的第一列[0]),符合np.select对choices的一维要求; - 给
np.select加上default参数,指定条件不满足时的默认值,不用提前初始化列。
修改后的完整代码:
import pandas as pd import numpy as np df = pd.DataFrame({ 'column1': ['--extract_text--','--extract_text--','--extract_text--','--extract_text--'], 'column2': ['A','A','B','B'] }) conditions = [df['column2'].str.contains('A', case=False, na=False)] # 转成一维Series,适配np.select的要求 choices = [df['column1'].str.extract('--(.*)--')[0]] # 指定default参数,条件不满足时用'a' df['new'] = np.select(conditions, choices, default='a') print(df)
运行后输出完全符合你的预期:
column1 column2 new 0 --extract_text-- A extract_text 1 --extract_text-- A extract_text 2 --extract_text-- B a 3 --extract_text-- B a
可选优化:提升代码可读性
如果你的提取逻辑更复杂,或者需要多次复用提取结果,可以先把提取值存为临时列,再在np.select中引用,代码会更清晰:
import pandas as pd import numpy as np df = pd.DataFrame({ 'column1': ['--extract_text--','--extract_text--','--extract_text--','--extract_text--'], 'column2': ['A','A','B','B'] }) # 先创建临时提取列 df['temp_extract'] = df['column1'].str.extract('--(.*)--')[0] conditions = [df['column2'].str.contains('A', case=False, na=False)] choices = [df['temp_extract']] df['new'] = np.select(conditions, choices, default='a') # 用完临时列可以删掉 df.drop('temp_extract', axis=1, inplace=True) print(df)
内容的提问来源于stack exchange,提问作者Dmitriy
相关产品推荐
相关产品推荐

