首页 > 解决方案 > 在 Pandas 中聚合多个 dtype 时如何获得一致的行为?

问题描述

我正在使用熊猫 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']

我想对Dur( float) 和Value( np.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?或者如何获取在 * 返回的多级数据框中的所有预期列?

标签: pythonpandastimedelta

解决方案


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

推荐阅读