如何在Python中基于另外两列的条件创建新列?
在Pandas中基于多列条件创建新列
首先构造你的原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'name': ['apple', 'banana', 'apple', 'pie'], 'address': ['hello1234', 'happy111', 'str3333', 'diary5144'] })
下面提供几种实现需求的方法:
方法1:使用numpy.select
通过定义条件列表和对应的值列表,批量处理行数据:
import numpy as np # 定义条件和对应的处理逻辑 conditions = [ df['name'] == 'apple', df['name'] == 'banana', df['name'] == 'pie' ] values = [ df['address'].str[:5], df['address'].str[:4], df['address'].str[:3] ] # 创建新列 df['want'] = np.select(conditions, values)
方法2:字典映射+apply
先建立名字和截取长度的映射关系,再逐行处理:
# 定义名字到截取长度的映射 name_length_map = {'apple':5, 'banana':4, 'pie':3} # 用apply处理每一行 df['want'] = df.apply(lambda row: row['address'][:name_length_map[row['name']]], axis=1)
方法3:映射长度后批量截取
先通过name列映射得到对应长度,再对address列按长度截取:
name_length_map = {'apple':5, 'banana':4, 'pie':3} # 先获取每行的截取长度 lengths = df['name'].map(name_length_map) # 按长度截取address df['want'] = [addr[:length] for addr, length in zip(df['address'], lengths)]
执行任意一种方法后,你都会得到期望的结果:
| name | address | want |
|---|---|---|
| apple | hello1234 | hello |
| banana | happy111 | happ |
| apple | str3333 | str33 |
| pie | diary5144 | dia |
内容的提问来源于stack exchange,提问作者leilei
相关产品推荐
相关产品推荐

