如何在pandas.resampler.agg()的字典式输入中为聚合函数传递参数?
如何在pandas.resampler.agg()的字典式输入中为聚合函数传递参数?
我完全懂你碰到的这个坑!当你用单列直接指定sum并在外层加min_count=1时,能正常得到空值;但换成字典形式指定聚合规则后,外层的参数根本传不进去,最后得到的是0而不是想要的NaN/None,确实挺让人头疼的。
其实解决方法很简单,你只需要把字典里的聚合函数从字符串改成元组形式,元组里第一个元素是函数名(比如'sum'),第二个元素是你要传递的参数字典就行。
举个具体的例子,用你提供的测试数据:
import pandas as pd df = pd.DataFrame(index=[pd.to_datetime('2020-01-01')], columns=['value'])
把原来不生效的写法:
# 这个写法不会传递min_count参数,得到的结果是0 df.resample('5min').agg({'value': 'sum'}, min_count=1)
改成下面这种正确形式:
# 用元组传递函数名和参数,min_count会被正确传给sum df.resample('5min').agg({'value': ('sum', {'min_count': 1})})
运行后你会发现,结果里的value列就会返回NaN(和你单列聚合时的预期结果一致),而不是0了。
原理也很好理解:当你给agg()的字典传入字符串时,pandas只会调用带默认参数的聚合函数;而用元组形式时,pandas会把后面的参数字典精准传递给对应的聚合函数,这样min_count=1就能生效——当采样周期内没有有效数据时,sum就会返回空值而不是默认的0。
如果你的数据有多个列,需要给不同列的聚合函数传不同参数,这种方式也完全适用,比如:
df.resample('5min').agg({ 'value1': ('sum', {'min_count': 1}), 'value2': ('mean', {'skipna': False}) })
这样每个列的聚合函数都能拿到自己需要的参数,非常灵活。
内容来源于stack exchange
相关产品推荐
相关产品推荐

