【问题标题】:how to get consistent behavior when aggregating multiple dtypes in pandas?在 Pandas 中聚合多个 dtype 时如何获得一致的行为?
【发布时间】:2018-05-22 09:24:21
【问题描述】:

我正在使用熊猫 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时如何得到同样的结果?或者如何获取 * 处返回的多级数据框中的所有预期列?

【问题讨论】:

    标签: python pandas timedelta


    【解决方案1】:

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

    为避免这种情况,您可以定义自己的 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
    

    【讨论】:

    • 谢谢。我认为这会奏效。如果我将 .apply 与 raw=True 一起使用,那么解决方案,尤其是对 pd.isnull 的调用会起作用吗?
    • 我不知道,可能不知道,你为什么不试试告诉我。
    • 当然可以。我现在正在使用智能手机:) 稍后会跟进
    【解决方案2】:

    np.nanmedian 调用np.isnan,它没有在日期时间对象上定义(应该使用np.isnat)。所以pandas默认是忽略该列,因为函数不能被调用。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2018-03-26
      • 2015-08-24
      • 1970-01-01
      相关资源
      最近更新 更多