基于Pandas列表列的条件从另一列表列返回对应值的实现方案
解决Pandas DataFrame根据列表列条件生成新列的问题
嘿,我来帮你搞定这个需求!你已经迈出了第一步——筛选出Second列包含'adj'的行,但我们的目标不是过滤行,而是给整个DataFrame新增一列,下面给你两种实用的方法:
方法一:用apply逐行处理(直观易懂)
这种方法适合快速实现逻辑,代码可读性很强:
# 新增Target列,当Second包含'adj'时取First列表的第一个元素,否则设为None df['Target'] = df.apply(lambda row: row['First'][0] if 'adj' in row['Second'] else None, axis=1)
axis=1表示按行处理每一条数据- 条件判断
'adj' in row['Second']检查当前行的Second列表是否包含目标值 - 满足条件时取
row['First'][0],也就是First列表的第一个元素(正好对应你期望的结果)
方法二:用掩码+向量化操作(更高效,适合大型DataFrame)
如果你的DataFrame数据量很大,推荐用这种方法,比apply的执行效率更高:
# 第一步:创建布尔掩码,标记哪些行的Second列包含'adj' mask = df['Second'].map(lambda x: 'adj' in x) # 第二步:初始化Target列,然后给符合条件的行赋值 df['Target'] = None df.loc[mask, 'Target'] = df.loc[mask, 'First'].str[0]
df['First'].str[0]是Pandas的向量化操作,能直接对整个列表列取第一个元素,比逐行循环快很多- 掩码
mask会生成一个布尔数组,精准定位需要赋值的行
验证结果
执行完上面任意一种方法后,你的DataFrame会变成这样:
First Second Target 0 ['First', 'value'] ['adj', 'noun'] First 1 ['second', 'value'] ['adj', 'noun'] second 2 ['third', 'value', 'is'] ['adj', 'noun', 'verb'] third 3 ['fourth', 'value', 'is'] ['adj', 'noun', 'verb'] fourth
完全符合你期望的第三列结果!
另外补充一句:如果你的数据里所有行的Second列都包含'adj'(就像示例里的情况),那可以直接简化成df['Target'] = df['First'].str[0],省掉条件判断~
内容的提问来源于stack exchange,提问作者zara kolagar
相关产品推荐
相关产品推荐

