Pandas groupby().count()在DataFrame子集执行时触发AttributeError
解决Pandas筛选子集赋值时的
AttributeError: 'Index' object has no attribute '_hasna'问题 场景与需求
现有两个DataFrame:
prodDataframe:包含n和bDatum列,bDatum存在NaT值stammDataframe:以n为索引,包含status和afQuote列
需求:为status=1的行,将afQuote列填充为对应n在prodDataframe中bDatum非NaT的条目数。
正常运行的代码(全量DataFrame)
对完整的stammDataframe执行以下代码可正常完成赋值:
stammDataframe.loc[:, 'afQuote'] = stammDataframe.index.map(prodDataframe.groupby('n')['bDatum'].count())
报错情况(筛选子集)
当筛选出status=1的子集后执行赋值,触发报错:
subDF = stammDataframe.loc[stammDataframe['status'] == 1] subDF.loc[:, 'afQuote'] = subDF.index.map(prodDataframe.groupby('n')['bDatum'].count())
错误信息:
AttributeError: 'Index' object has no attribute '_hasna'
问题原因
初始创建afQuote列时使用了stammDataframe['afQuote'] = np.NaN,导致该列的数据类型为float;而prodDataframe.groupby('n')['bDatum'].count()返回的是整数类型的结果。在对筛选后的子集进行赋值时,这种类型不兼容性触发了上述错误。
解决方案
有两种可行的修复方式:
方式一:初始创建可空整数类型列
创建afQuote列时直接指定可空整数类型,避免类型不匹配:
stammDataframe['afQuote'] = pd.Series(dtype='Int64')
方式二:将count结果转换为float类型
在映射前把分组统计的结果转为float类型,与初始列的类型匹配:
subDF.loc[:, 'afQuote'] = subDF.index.map(prodDataframe.groupby('n')['bDatum'].count().astype(float))
内容的提问来源于stack exchange,提问作者t3ahunt3r
相关产品推荐
相关产品推荐

