在DataFrame中添加条件列时触发ValueError问题求助
问题根源
你触发的ValueError是因为在split_name函数里,直接用整个test_data['Tussenvoegsel'].str.len() != 0做判断——这会返回一个布尔值Series,而if语句需要单个布尔值,Python无法确定整个Series的“真假”,所以报错。
修复方案
要让函数能获取当前行的Tussenvoegsel值,而不是整个列。可以通过apply(axis=1)传递整行数据给函数,具体代码如下:
import re import pandas as pd def split_name(row): # 获取当前行的姓名和中间名 full_name = row['Naam'] tussenvoegsel = row['Tussenvoegsel'] # 判断当前行的中间名是否非空(处理空字符串和NaN) if pd.notna(tussenvoegsel) and len(tussenvoegsel.strip()) > 0: return "" else: # 提取姓名中最后一个点后的内容(比如从"Dhr. V. Andersen"取"Andersen") match = re.search(r'\. (\w+)$', full_name) return match.group(1) if match else "" # 应用函数到每行 test_data['Achternaam'] = test_data.apply(split_name, axis=1)
运行结果
执行后得到的DataFrame与你的预期完全一致:
Naam Tussenvoegsel Achternaam 0 Dhr. V. Andersen Andersen 1 Mevr. J.C. van der Kosan van der 2 Dhr. P.M.M. van Zomer van 3 Mevr. M.J.J. Raimondo Raimondo 4 Mevr. E. van de Doorn van de
额外说明
- 替换了你原有的正则:原正则会匹配最后一个点及后续所有字符(比如". Andersen"),再手动截取
[3:100]容易出错,用re.search(r'\. (\w+)$')可以直接提取目标姓氏。 - 空值判断加入了
pd.notna和strip(),覆盖了NaN、全空格字符串等边界情况。
内容的提问来源于stack exchange,提问作者Luuk_148
相关产品推荐
相关产品推荐

