gpt4 book ai didi

python - 如何在 Pandas 的组中删除某种类型的值?

转载 作者:行者123 更新时间:2023-12-03 20:05:25 24 4
gpt4 key购买 nike

我有以下数据框,它是较大数据框的一小部分:

   acc_num   trans_cdi
0 1 c
1 1 d
3 3 d
4 3 c
5 3 d
6 3 d
我想删除最后一项是“d”的所有行。所以我想要的数据框看起来像这样:
   acc_num   trans_cdi
0 1 c
3 3 d
4 3 c
所以关键是,一个组不应该将“d”作为最后一项。
有一个代码可以删除最后一项是“d”的组中的最后一行。但在这种情况下,例如,我必须运行代码两次才能删除第 3 组中的所有最后一个“d”-s。
clean_3 = clean_2[clean_2.groupby('account_num')['trans_cdi'].transform(lambda x: (x.iloc[-1] != "d") | (x.index != x.index[-1]))]
这个问题有更好的解决方案吗?

最佳答案

我们可以使用 idxmax在这里反转数据[::-1]然后获取索引:

grps = df['trans_cdi'].ne('d').groupby(df['acc_num'], group_keys=False)
idx = grps.apply(lambda x: x.loc[:x[::-1].idxmax()]).index
df.loc[idx]

acc_num trans_cdi
0 1 c
3 3 d
4 3 c

对连续值进行测试
   acc_num trans_cdi
0 1 c
1 1 d <--- d between two c, so we need to keep
2 1 c
3 1 d <--- row to be dropped
4 3 d
5 3 c
6 3 d
7 3 d

grps = df['trans_cdi'].ne('d').groupby(df['acc_num'], group_keys=False)
idx = grps.apply(lambda x: x.loc[:x[::-1].idxmax()]).index
df.loc[idx]

acc_num trans_cdi
0 1 c
1 1 d
2 1 c
4 3 d
5 3 c
仍然给出正确的结果。

关于python - 如何在 Pandas 的组中删除某种类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62967408/

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