在 pandas 中聚合多个数据类型时如何获得一致的行为?
how to get consistent behavior when aggregating multiple dtypes in pandas?
我正在使用 pandas 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' 被 静默地 忽略和删除,而如果仅应用
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
时如何得到相同的?或者如何获取在 * 处返回的多级数据框中的所有预期列?
np.nanmedian
调用未在日期时间对象上定义的 np.isnan
(应该使用 np.isnat
)。因此 pandas 默认忽略该列,因为无法调用该函数。
如果你想要一个明确的错误,你可以使用
df.groupby(...).agg({c: [np.nansum, np.nanmedian] for c in cols})
用户 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
我正在使用 pandas 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' 被 静默地 忽略和删除,而如果仅应用
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
时如何得到相同的?或者如何获取在 * 处返回的多级数据框中的所有预期列?
np.nanmedian
调用未在日期时间对象上定义的 np.isnan
(应该使用 np.isnat
)。因此 pandas 默认忽略该列,因为无法调用该函数。
如果你想要一个明确的错误,你可以使用
df.groupby(...).agg({c: [np.nansum, np.nanmedian] for c in cols})
用户 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