Pandas groupby调用first方法未跳过None值 传入dropna参数报错
报错原因
- 你使用的pandas版本低于1.1.0:
dropna参数是pandas 1.1.0版本才为groupby.first()方法新增的配置项,旧版本调用时传入该参数就会抛出unexpected keyword argument 'dropna'的报错。 first()未自动跳过None的根因:你构造DataFrame时用np.array包裹同时包含整数和None的元组,numpy会自动将数组类型设为object,此时存储的是Python原生None对象,老版本pandas聚合时默认不会将这类值识别为需要跳过的缺失值,因此会直接返回分组中第一个出现的None。
无需提前转换None的解决方案
如果确实无法在分组前将None转换为pandas可识别的缺失值,可以用分组后自定义过滤取数的逻辑实现需求:
import numpy as np import pandas as pd df = pd.DataFrame(np.array([(1, 29),(1, 50),(2, None),(2, 12),(3,None)]),columns=['day', 'amount']) # 自定义取分组第一个非空值 res = df.groupby('day')['amount'].apply( lambda group: group[group.notna()].iloc[0] if group.notna().any() else None )
输出结果符合预期:
day 1 29 2 12 3 None Name: amount, dtype: object
可升级pandas的优化方案
如果可以升级pandas到1.1.0及以上版本,也可以先做缺失值兼容再调用带参数的first():
# 先把列转换为数值类型,原生None会自动转为np.nan df['amount'] = pd.to_numeric(df['amount'], errors='coerce') # 调用带dropna参数的first res = df.groupby('day')['amount'].first(dropna=True)
内容的提问来源于stack exchange,提问作者Daniel Wyatt
相关产品推荐
相关产品推荐

