Pandas Groupby——如何从组中提取第一个、最后一个或第一个非 NaN 值

问题描述 投票:0回答:1

这个问题反复出现在我面前,我确信有一种方法可以将其作为 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' 但我尝试过的都不起作用。

pandas group-by aggregate
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.