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