在聚合熊猫中的多个dtypes时如何获得一致的行为?

时间:2018-05-22 09:24:22

标签: python pandas timedelta

我正在使用pandas 0.20.2。

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

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']

我想将一些功能应用于Durfloat)和Valuenp.timedelta64)。 特别是,结合np.nansumnp.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'被静默忽略并删除,而如果仅适用 np.nansum我获得了预期的结果,包括两列

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 个答案:

答案 0 :(得分:3)

用户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

答案 1 :(得分:2)

np.nanmedian调用未在datetime对象上定义的np.isnan(而应使用np.isnat)。因此,pandas默认忽略该列,因为无法调用该函数。

如果您想要显式错误,可以使用

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