使用isin()筛选Period类型字段失败,直接==对比正常的问题
问题根源与解决办法
你的Quarter字段是period[Q-DEC]类型,传给isin()的是字符串列表,类型不匹配导致筛选失效;但直接用==时,Pandas会自动做隐式类型转换,所以能正常匹配。
修复方案
方案1:用Period对象匹配(推荐)
把筛选的季度字符串转为和目标列同频率的Period对象,再传入isin():
import pandas as pd import numpy as np # 构造同频率的Period对象列表 target_quarters = [pd.Period('2022Q3', freq='Q-DEC'), pd.Period('2022Q4', freq='Q-DEC')] filter = (df_1['Year'] == 2022) & (df_1['Quarter'].isin(target_quarters)) df_incumbent = df_1[filter].groupby(['Lane', 'Carrier Scac', 'Quarter']).agg( {'Cust Linehaul': np.mean, 'Load Number': 'count'} ).unstack('Quarter', fill_value=0) # 计数/均值用0代替NaN更合理
方案2:转字符串后匹配
将Quarter列临时转为字符串类型,再用原字符串列表筛选:
import numpy as np filter = (df_1['Year'] == 2022) & (df_1['Quarter'].astype(str).isin(['2022Q3', '2022Q4'])) df_incumbent = df_1[filter].groupby(['Lane', 'Carrier Scac', 'Quarter']).agg( {'Cust Linehaul': np.mean, 'Load Number': 'count'} ).unstack('Quarter', fill_value=0)
为什么直接==能生效?
Pandas处理单个值的==比较时,会自动把右侧的字符串解析为与左侧Period同频率的Period对象,所以匹配成功;但isin()不会做这种自动类型转换,必须保证列表元素类型和目标列一致,否则会返回全False的筛选结果,最终得到空DataFrame。
内容的提问来源于stack exchange,提问作者Rajib Lochan Sarkar
相关产品推荐
相关产品推荐

