gpt4 book ai didi

python - 获取每组最大值的索引

转载 作者:行者123 更新时间:2023-12-04 07:44:41 35 4
gpt4 key购买 nike

我有一个数据框 df看起来像这样。

df = pd.DataFrame(
{
"id": [101, 102, 102, 103, 201, 202, 202, 203],
"type": ["A1", "B2", "B3", "A3", "A1", "B2", "B3", "A1"],
"Val": np.random.randn(8),
}
)

id type value
0 101 A1 -0.238221
1 102 B2 1.051656
2 102 B3 -1.335417
3 102 A3 0.859323
4 201 A1 -0.819574
5 202 B2 -0.589278
6 202 B3 0.925917
7 203 A1 -0.044021
首先,我应用以下聚合来获得特定的 type每个 id
    idx = df.groupby("id")["type"].transform(lambda x: x.str.contains("B"))

df[idx]

id type value
1 102 B2 1.051656
2 102 B3 -1.335417
5 202 B2 -0.589278
6 202 B3 0.925917
现在,这是我的问题。我需要删除任何 id 的所有记录哪里 type值不是最大值。最大,我的意思是有这个优先级:
An > Ak 其中 n > k。例如,对于 id 102,B3 > B2,所以B2类型的行为 id 102 应该被删除。请注意,对于任何 id , 初始数据帧不包含任何重复 type柱子。也就是说,不存在id 102有两个B2的情况。例如:
    id    type      value
1 102 B2 1.051656
2 102 B2 -1.335417
所以,我们不需要考虑 type 上的平等情况。任何列 id .
我试过的是这个;这给了我想要的最大值。
df[idx].groupby("id").max()
type value
id
102 B3 1.051656
202 B3 0.925917
但是,我需要修改我的 原版数据框 df ,以便删除除上述记录之外的任何其他记录。我需要对任何 type 执行此操作A,B,...Z 换句话说,我需要 df最后变成这个样子。
     id  type       value
0 101 A1 -0.238221
2 102 B3 -1.335417
3 102 A3 0.859323
4 201 A1 -0.819574
6 202 B3 0.925917
7 203 A1 -0.044021
编辑:边缘情况
有一个异常(exception) type ,BA。该类型的优先级确定如下:
BA type 的可能性有限值:zBA 或 yBA
这里的优先级是 zBA > yBA
例如
     id  type       value
0 102 zBA -0.238221
1 102 yBA 1.051656
输出
     id  type       value
0 102 zBA -0.238221

最佳答案

您可以将字母和数字拉入单独的列,对字母进行分组以获得最大数字,过滤数字并获得最终数据框:

 (df.assign(letter = df['type'].str[0], 
number = df['type'].str[-1],
filt = lambda df: df.number.eq(df.groupby(['id', 'letter'])
.number.transform('max')))
.loc[lambda df: df.filt, df.columns])

id type value
0 101 A1 -0.238221
2 102 B3 -1.335417
3 102 A3 0.859323
4 201 A1 -0.819574
6 202 B3 0.925917
7 203 A1 -0.044021

关于python - 获取每组最大值的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67258513/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com