这是一个关于如何在pandas中有效地应用函数的一般性问题。我经常遇到需要将函数应用于pd.Series
的情况,并且只将函数应用于唯一值会更快。
例如,假设我有一个非常大的数据集。一列是date
,我想添加一列,给出date
的最后一个季度的日期。我会这样做:
mf['qtr'] = pd.Index(mf['date']) + pd.offsets.QuarterEnd(0)
但是对于大型数据集,这可能需要一段时间。因此,为了加快速度,我将提取date
的唯一值,对这些值应用函数,然后将其合并回原始数据:
dts = mf['date'].drop_duplicates()
eom = Series(pd.Index(dts) + pd.offsets.QuarterEnd(0), index=dts)
eom.name = 'qtr'
mf = pd.merge(mf, eom.reset_index())
这比上面的一行代码快得多。
所以我的问题是:这真的是做这件事的正确方法吗,还是有更好的方法?
并且,给pandas添加一个功能来自动采用这种独特的/apply/merge方法是否有意义和可行?(它不适用于某些函数,例如依赖于滚动数据的函数,因此可能用户必须显式请求此行为。)
我个人只对日期列进行分组,然后为每个组调用函数:
mf.groupby('date',as_index=False)['date'].apply(lambda x: x + pd.offsets.QuarterEnd(0))
我想应该可以
编辑
好的,上面的不起作用,但下面的可以,但我认为这是有点扭曲:
mf.groupby('date', as_index=False)['date'].apply(lambda x: (pd.Index(x)+ QuarterEnd(0))[0])
我们为每个日期创建一个datetimeindex,添加偏移量,然后访问单个元素以返回值,但我个人认为这不是很好。