pandas中lambda函数正常但命名函数返回None的问题排查
排查pandas命名函数生成新列全为None的问题
这种情况我碰到过好多次,大概率是命名函数的一个小细节没处理好——忘记显式返回结果!毕竟lambda是隐式返回处理后的数值,而命名函数必须用return关键字把结果抛出来,不然函数默认会返回None,这就导致你的新列全是None了。
举个具体的例子对比一下:
能正常工作的lambda写法
# lambda隐式返回split后的第一个元素 data['transaction month'] = data['transaction date'].apply(lambda x: x.split('/')[0])
错误的命名函数(导致全None)
def get_month(x): # 这里只做了拆分操作,但没有return结果! x.split('/')[0] data['transaction month'] = data['transaction date'].apply(get_month)
修复后的命名函数
只需要加上return就行:
def get_month(x): # 显式返回提取的月份字符串 return x.split('/')[0] data['transaction month'] = data['transaction date'].apply(get_month)
其他可能的小概率原因
如果上面的修复没用,再排查这两个点:
- 函数内部吞了异常且无返回:比如你加了
try-except但异常分支没有返回值,比如:
这种情况如果所有行都触发了异常(比如日期格式全不符合预期),也会全返回None,但你的lambda能正常工作,所以这个可能性极低。def get_month(x): try: return x.split('/')[0] except: pass # 异常时没有返回,默认给None - 参数不匹配:比如你的函数定义了多个参数,但
apply只传了单个元素(比如函数写了def get_month(x, y)但没给默认值),不过这种情况会直接报错,不会返回None。
额外建议:更健壮的日期处理方式
其实用字符串拆分提取月份不够稳妥,万一遇到mm/dd/yyyy(比如10/05/2023)或者格式不统一的情况容易出错。推荐用pandas自带的日期解析工具:
import pandas as pd # 先把字符串转成datetime类型,再提取月份(会得到数字类型的月份,比如1、10) data['transaction month'] = pd.to_datetime(data['transaction date'], format='%m/%d/%Y').dt.month # 如果想保留字符串格式的月份,也可以这样: data['transaction month'] = pd.to_datetime(data['transaction date'], format='%m/%d/%Y').dt.strftime('%m')
内容的提问来源于stack exchange,提问作者Ravin
相关产品推荐
相关产品推荐

