Pandas中自定义函数生成新列异常,如何正确提取行程始发地?
问题原因与解决方法
嘿,这个问题我之前也踩过坑!核心问题在于你直接把整个df.Journey(这是一个Pandas Series对象)传给了getOrigin函数,而不是让函数逐个处理Series里的每一行数据。
为什么会出错?
当你执行getOrigin(df.Journey)时,函数里的" to " in journey判断的是字符串" to "是否存在于整个Series对象中,而不是每个单独的Journey字符串里。显然这个条件永远不成立,所以所有行都返回了"No origin"。
正确的实现方式
方法1:用apply让函数逐行处理
这是最直接适配你现有自定义函数的方式,apply会把Series中的每个元素单独传入getOrigin函数:
def getOrigin(journey): if " to " in journey: return journey.split(" to ")[0] else: return "No origin" df['Origin'] = df['Journey'].apply(getOrigin)
方法2:更高效的Pandas向量化操作(推荐)
如果你的数据集比较大,推荐用Pandas内置的字符串方法,比apply的逐行处理效率高很多:
# 先拆分字符串取第一部分 df['Origin'] = df['Journey'].str.split(' to ', n=1).str[0] # 对没有" to "的行填充"No origin" df['Origin'] = df['Origin'].where(df['Journey'].str.contains(' to '), 'No origin')
测试验证
比如我们创建测试数据:
import pandas as pd df = pd.DataFrame({'Journey': ['America to England', 'Canada to Japan', 'Australia']})
用上面任意一种方法处理后,df['Origin']的结果都会是:
0 America 1 Canada 2 No origin Name: Origin, dtype: object
完全符合你的预期!
内容的提问来源于stack exchange,提问作者superwelling
相关产品推荐
相关产品推荐

