为何查询非首次订单缺失值返回空索引?代码排查求助
问题:非首次订单中
days_since_prior_order是否存在缺失值? 我需要查询非客户首次订单(order_number > 1)里,days_since_prior_order列是否存在缺失值,DataFrame命名为df_orders。原本写的代码想筛选出该列缺失且order_number大于1的数据,但执行后返回空DataFrame,不确定是该用order_number列还是代码本身有问题。
附DataFrame信息:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 478967 entries, 0 to 478966 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 order_id 478967 non-null int64 1 user_id 478967 non-null int64 2 order_number 478967 non-null int64 3 order_dow 478967 non-null int64 4 order_hour_of_day 478967 non-null int64 5 days_since_prior_order 450148 non-null float64 dtypes: float64(1), int64(5) memory usage: 21.9 MB
执行的错误代码:
# Are there any missing values where it's not a customer's first order? m_v_fo= df_orders[df_orders['days_since_prior_order'].isna() > 1] print(m_v_fo.head())
执行结果:
Empty DataFrame Columns: [order_id, user_id, order_number, order_dow, order_hour_of_day, days_since_prior_order] Index: []
问题分析与修正
你的代码逻辑完全写错了:df_orders['days_since_prior_order'].isna() > 1 这行是错误的。isna()返回的是布尔值(True/False),和1比较时会自动把True转成1,False转成0,所以isna()>1永远是False,自然筛选不到任何数据。
正确的逻辑是同时满足两个条件:
days_since_prior_order为缺失值(isna()结果为True)order_number大于1(非首次订单)
修正后的代码:
# 筛选非首次订单且days_since_prior_order缺失的数据 m_v_fo = df_orders[(df_orders['days_since_prior_order'].isna()) & (df_orders['order_number'] > 1)] print(m_v_fo.head())
补充验证
从你的DataFrame统计来看,days_since_prior_order共有 478967 - 450148 = 28819 个缺失值。这类字段的缺失通常只出现在首次订单(order_number=1)里——因为首次订单没有前序订单,所以没有“距上一次订单的天数”这个数据。你可以运行下面的代码验证缺失值对应的order_number分布:
# 查看缺失值对应的order_number统计 print(df_orders[df_orders['days_since_prior_order'].isna()]['order_number'].value_counts())
如果验证后发现所有缺失值都对应order_number=1,那修正后的代码返回空DataFrame是正常的,说明非首次订单里确实没有该字段的缺失值,这是数据本身的特征,不是代码问题。
内容的提问来源于stack exchange,提问作者Roger Sterling
相关产品推荐
相关产品推荐

