Python 如何通过按熊猫中的特定位置分组来应用函数?

Python 如何通过按熊猫中的特定位置分组来应用函数?,python,pandas,Python,Pandas,上面是数据帧类型。 我想做的是将每个名称视为一个子集,直到类型发生更改,并获得减去第一个和最后一个值的值​​价值取向​​每个子集的 最终想要的形状似乎是这种类型 logged_at type name values 2020-08-17 00:02:22 weak AA 55 2020-08-17 00:12:20 weak AA 54 2020-08-17 00:22:24 weak AA 53 2020-08-1

上面是数据帧类型。 我想做的是将每个名称视为一个子集,直到类型发生更改,并获得减去第一个和最后一个值的值​​价值取向​​每个子集的

最终想要的形状似乎是这种类型

logged_at           type    name    values
2020-08-17 00:02:22 weak    AA      55
2020-08-17 00:12:20 weak    AA      54
2020-08-17 00:22:24 weak    AA      53
2020-08-17 00:32:25 weak    AA      50
2020-08-17 00:42:28 strong  AA      44
2020-08-17 00:52:22 strong  AA      33
2020-08-17 01:02:20 strong  AA      32
2020-08-17 01:22:24 weak    AA      56
2020-08-17 01:32:25 weak    AA      55
2020-08-17 01:42:28 weak    AA      43
无论何时更改类型,都应该分配一个秩值,以便可以区分每个子集,但我现在想到的是,通过iTerPles创建一个新列表,在检查类型、提高秩并将其存储在列表中时,会出现一个不同于上一个类型的类型,然后是一个新列。我想把它添加到。。。
我不知道这是否有效。大约有3亿行,因此我正在寻找最有效的方法。

如果数据帧是按时间排序的,只需按如下方式删除重复项即可

logged_at           type    name    values  rank
2020-08-17 00:02:22 weak    AA      5        1
2020-08-17 00:42:28 strong  AA      12       2
2020-08-17 01:22:24 weak    AA      13       3

您可以分阶段将其打破:

df.drop_duplicates(by = 'logged_at', keep = 'first')

您可以重置索引。然而,有3亿排,我不认为熊猫是正确的选择。

300mm排?你是如何存储它们的?@BEN_-YO现在它存储在dynamodb中,每次使用它都会被调用。@BEN_-YO我错了。那是3000万。有时记录的数量是不一样的。相差10分钟我搞错了。那是3000万。谢谢你的回复!
# get the first values :
top = df.loc[df["type"].ne(df["type"].shift())]

# get the last values
bottom = df.loc[df["type"].ne(df["type"].shift(-1))]

#get the difference in values and generate the rank : 
top.assign(values=top["values"].array - bottom["values"].array, 
           rank=range(1, 1 + len(top)))

    logged_at          type   name  values  rank
0   2020-08-17 00:02:22 weak    AA      5   1
4   2020-08-17 00:42:28 strong  AA      12  2
7   2020-08-17 01:22:24 weak    AA      13  3