无法基于其他列在Pandas DataFrame中创建新列,求助解决
问题:DataFrame中根据条件生成新列
用户场景:
在第一份Python工作的首次编码任务中,无法在DataFrame中创建符合要求的新列,尝试过lambda、isin、contains方法,需求如下:
DataFrame数据(前两列dtype为object):
Country code| Countries || Column c | KR | KR~CN_SG~PH || Valid | RO | CN~PK || Invalid | NL | CZ_BE~NL_IT~DE || Valid | SG | HK~SK_DZ_AL_CN_GR_RU~SA~SG || Valid | US | ZA~SE~ES~CH_UA || Invalid |
规则:
- Valid:当
Country code的值作为独立项存在于Countries列的内容中时 - Invalid:当
Country code的值未作为独立项出现在Countries列的内容中时
解决方案
方法1:分割字符串后精准匹配(推荐)
把Countries列按分隔符~拆分成列表,再判断国家代码是否在列表内,能避免部分字符误匹配的问题:
import pandas as pd # 构造示例DataFrame(实际使用时替换为你的数据) df = pd.DataFrame({ 'Country code': ['KR', 'RO', 'NL', 'SG', 'US'], 'Countries': ['KR~CN_SG~PH', 'CN~PK', 'CZ_BE~NL_IT~DE', 'HK~SK_DZ_AL_CN_GR_RU~SA~SG', 'ZA~SE~ES~CH_UA'] }) # 生成目标列 df['Column c'] = df.apply( lambda row: 'Valid' if row['Country code'] in row['Countries'].split('~') else 'Invalid', axis=1 )
方法2:结合numpy简化写法
如果习惯用numpy的条件判断,可以这样写:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Country code': ['KR', 'RO', 'NL', 'SG', 'US'], 'Countries': ['KR~CN_SG~PH', 'CN~PK', 'CZ_BE~NL_IT~DE', 'HK~SK_DZ_AL_CN_GR_RU~SA~SG', 'ZA~SE~ES~CH_UA'] }) df['Column c'] = np.where( df.apply(lambda x: x['Country code'] in x['Countries'].split('~'), axis=1), 'Valid', 'Invalid' )
方法3:正则精准匹配
如果想用str.contains,可以通过正则限定匹配边界,确保只匹配完整的国家代码项:
df['Column c'] = df.apply( lambda row: 'Valid' if df['Countries'].str.contains(f'(^|~){row["Country code"]}(~|$)').iloc[row.name] else 'Invalid', axis=1 )
为什么之前的方法可能失效?
isin方法是判断元素是否在序列中,直接用df['Country code'].isin(df['Countries'])会因为Countries是字符串而非列表,导致判断逻辑错误。- 直接使用
str.contains会出现部分匹配问题,比如CN会匹配到CN_SG,而我们需要的是完整的CN独立项。
内容的提问来源于stack exchange,提问作者martinworkshere
相关产品推荐
相关产品推荐

