Pandas如何根据DataFrame列是否含Pasta新增列完成0/1打分
需求说明
现有存储餐食数据的DataFrame,其中Component列记录每份餐食的组成成分,示例数据如下:
---------------------------------- | ID | Component | ---------------------------------- | 1 | Vegetables | | 2 | Pasta | | 3 | Pasta, Vegetables | | 4 | Pulses, Vegetables | | 5 | Meat, Pasta, Vegetables| | 6 | Meat, Vegetables | | 7 | Pulses | | 8 | Meat | ----------------------------------
需要新增打分列:餐食包含Pasta则赋值为1,不包含则赋值为0,即ID为2、3、5的记录得1分,其余记录得0分,要求代码仅匹配独立的'Pasta'术语,避免误匹配。
实现代码
直接使用pandas自带的字符串正则匹配方法即可,通过单词边界符保证仅匹配独立的Pasta术语,不会把包含Pasta字符的其他长单词(如PastaSauce)误判为命中,代码如下:
# 为DataFrame新增打分列 df['pasta_score'] = df['Component'].str.contains(r'\bPasta\b', regex=True).astype(int)
代码逻辑说明:
str.contains()用于对Series每一行做字符串匹配,传入正则r'\bPasta\b'中的\b是单词边界标识,只会匹配独立出现的Pasta术语.astype(int)将匹配返回的布尔值True/False直接转换为整数1/0,正好对应打分规则
如果你的Component列成分统一用逗号分隔,也可以用拆分后精准判断的写法,效果完全一致:
df['pasta_score'] = df['Component'].apply( lambda x: 1 if 'Pasta' in [item.strip() for item in x.split(',')] else 0 )
运行后得到的结果完全符合预期:
| ID | Component | pasta_score |
|---|---|---|
| 1 | Vegetables | 0 |
| 2 | Pasta | 1 |
| 3 | Pasta, Vegetables | 1 |
| 4 | Pulses, Vegetables | 0 |
| 5 | Meat, Pasta, Vegetables | 1 |
| 6 | Meat, Vegetables | 0 |
| 7 | Pulses | 0 |
| 8 | Meat | 0 |
内容的提问来源于stack exchange,提问作者COOKIE1994
相关产品推荐
相关产品推荐

