如何比较datetime64[ns]类型日期并选较早值?代码报错求助
问题原因
你代码里的错误是因为在apply的lambda表达式中,条件判断用了整个DataFrame的列(df_analisis_invertido['Fecha de la primera conversion']和df_analisis_invertido['Fecha de creacion']),这会生成一个布尔值Series,而lambda需要的是当前行的单个布尔值,Python无法直接判断整个Series的真假,所以抛出了ValueError: The truth value of a Series is ambiguous错误。
解决方案
方案1:修正apply的lambda逻辑
把条件判断里的整列引用改成当前行的元素引用,用x['列名']来获取当前行的对应值:
df_analisis_invertido['Fecha de la primera conversion'] = df_analisis_invertido.apply( lambda x: x['Fecha de creacion'] if x['Fecha de la primera conversion'] < x['Fecha de creacion'] else x['Fecha de la primera conversion'], axis=1 )
方案2:用矢量化操作替代apply(更高效)
apply是逐行处理,大数据集下效率较低,推荐用numpy或pandas的矢量化方法:
方法2.1:numpy.where
import numpy as np df_analisis_invertido['Fecha de la primera conversion'] = np.where( df_analisis_invertido['Fecha de la primera conversion'] < df_analisis_invertido['Fecha de creacion'], df_analisis_invertido['Fecha de creacion'], df_analisis_invertido['Fecha de la primera conversion'] )
方法2.2:pandas.DataFrame.where
df_analisis_invertido['Fecha de la primera conversion'] = df_analisis_invertido['Fecha de la primera conversion'].where( df_analisis_invertido['Fecha de la primera conversion'] >= df_analisis_invertido['Fecha de creacion'], other=df_analisis_invertido['Fecha de creacion'] )
方案3:直接取两列的最小值(最简洁)
你的需求本质是取两个日期中较早的那个,datetime类型支持直接比较,所以可以直接用min方法:
df_analisis_invertido['Fecha de la primera conversion'] = df_analisis_invertido[['Fecha de la primera conversion', 'Fecha de creacion']].min(axis=1)
内容的提问来源于stack exchange,提问作者Diego González Castellanos
相关产品推荐
相关产品推荐

