这个问题反复出现在我面前,我确信有一种方法可以将其作为 groupby().agg() 命令的一部分来实现,但我无法弄清楚。我经常必须对时间序列进行重新采样,并且需要保留某些非数字行的值,有时是“日期时间”索引,有时是“名称”列等。
原df--
例如,下面的这一行非常适合将包含“名称”、“价格”、“数量”列的数据帧转换为 1 分钟时间序列:
1_min_df = df.groupby(pd.Grouper(freq="1T")).agg({'Price': 'ohlc', 'Volume': 'sum'})
问题是我完全丢失了所有“姓名”信息。对于每个 1 分钟的分组,通常可以从“Name”中获取第一个、最后一个或任何非 NaN 值。我不知道如何获取它并将其包含在结果数据框中。
这是同一问题的另一种变体。下面的这一行非常适合对行进行分组(使用 bar 函数),这些行对累积总数约为 1000 “Volume”的行进行分组。但我需要获取每组第一行的“DateTime”值,并将该值保留在结果分组行的“DateTime”列中。
vol_1000_df = df.groupby(bar(np.cumsum(df_concat['Volume']), 1000)).agg({'Price': 'ohlc', 'Volume': 'sum'})
我尝试了 agg() 函数的各种附加参数,例如 'Name':'head' 或 'DateTime':'tail' 但我尝试过的都不起作用。
IIUC,你必须在
'Name': 'first'
中使用agg
来保存Name
的信息:
>>> (df.groupby(df.index.floor('1min'))
.agg({'Name': 'first', 'Price': 'ohlc', 'Volume': 'sum'}))
Name Price Volume
Name open high low close Volume
DateTime
1997-09-10 00:06:00 ESU97 934.00 934.00 934.00 934.00 0
1997-09-10 00:13:00 ESU97 933.75 933.75 933.75 933.75 0