代码之家  ›  专栏  ›  技术社区  ›  00__00__00

如何在聚合大熊猫的多个数据类型时获得一致的行为?

  •  2
  • 00__00__00  · 技术社区  · 8 年前

    我用的是熊猫0.20.2。

    在聚合混合数据类型的数据帧时,得到的结果不一致。 以下是一些示例数据:

    import pandas as pd
    import numpy as np
    df=pd.DataFrame(data=pd.date_range('20100201', periods=10,     
    freq='5h3min'),columns=['Start'])
    df.loc[:,'End']=df.loc[:,'Start']+pd.Timedelta(4,'h')
    df.loc[:,'Value']=42.0
    df.loc[:,'Dur']=df.loc[:,'End']-df.loc[:,'Start']
    

    我想对两者都应用一些函数 Dur ( float ) Value ( np.timedelta64 ) 尤其是结合 np.nansum 和 np.nanmax 我得到以下信息:

    **df.resample('1D',on='Start')['Dur','Value'].agg([np.nansum,np.nanmedian])**
    Out[16]: 
                Value          
               nansum nanmedian
    Start                      
    2010-02-01  210.0      42.0
    2010-02-02  210.0      42.0
    

    列“dur”是 默默地 忽略并删除,而如果仅应用 南苏丹 我得到了预期的结果,包括两列

    f.resample('1D',on='Start')['Dur','Value'].agg([np.nansum])
    Out[17]: 
                    Dur  Value
                 nansum nansum
    Start                     
    2010-02-01 20:00:00  210.0
    2010-02-02 20:00:00  210.0
    

    申请时如何获得相同的结果 nanmedian ?或者如何获取在*处返回的多级数据帧中的所有预期列?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Haleemur Ali    8 年前

    用户 Yakym Pirozhenko 是正确的,错误是由于应用了 np.isnan 在函数内部的时间戳列上 np.nanmedian

    为了避免这种情况,您可以定义自己的 nanmedian 这将在非空时间戳上应用np.median:

    def mynanmedian(x): 
        return np.median(x[pd.notnull(x)])
    
    df.resample('1D',on='Start')['Dur','Value'].agg([np.nansum,mynanmedian])
    # out:
                Dur                     Value
                nansum   mynanmedian    nansum  mynanmedian
    Start               
    2010-02-01  20:00:00    04:00:00    210.0          42.0
    2010-02-02  20:00:00    04:00:00    210.0          42.0
    
        2
  •  2
  •   hilberts_drinking_problem    8 年前

    np.nanmedian 电话 np.isnan 它不是在datetime对象上定义的(而应该使用 np.isnat )所以pandas默认忽略列,因为无法调用函数。

    如果你想要一个明确的错误,你可以使用

    df.groupby(...).agg({c: [np.nansum, np.nanmedian] for c in cols})