gpt4 book ai didi

python - 如何在 Python 中使用 pandas 满足特定条件后删除观察结果

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:00 25 4
gpt4 key购买 nike

我正在使用 pandas 数据框,我想在满足条件 (cond=1) 后删除同名的观察结果。

我的数据集如下所示:

person    cond
A 0
A 0
A 1
A 0
A 0
B 0
B 1
C 1
C 0

我想得到这个:

person    cond
A 0
A 0
A 1
B 0
B 1
C 1

我希望代码首先检查下一个人是否具有相同的名称,然后检查是否满足条件(cond=1),如果满足,则删除所有具有相同名称的下一行。

有人可以帮我解决这个问题吗?

最佳答案

您可以使用groupby应用一个lambda来实现这一点,该lambda使用从头开始切片df直到第一个最大值idxmax,在本例中将是第一个 1 值:

In [16]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()]).reset_index()

Out[16]:
person level_1 cond
0 A 0 0
1 A 1 0
2 A 2 1
3 B 5 0
4 B 6 1
5 C 7 1

您还可以额外调用 drop 来删除 'level_1' 列:

In [23]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()]).reset_index().drop('level_1', axis=1)

Out[23]:
person cond
0 A 0
1 A 0
2 A 1
3 B 0
4 B 1
5 C 1

更新

为了处理组中没有 1 的情况,我们可以测试 lambda 中是否存在这种情况:

In [24]:
import pandas as pd
import io
# setup some data
t="""person cond
A 0
A 0
A 1
A 0
A 0
B 0
B 1
C 1
C 0
D 0
D 0"""
df = pd.read_csv(io.StringIO(t), delim_whitespace=True)
df

Out[24]:
person cond
0 A 0
1 A 0
2 A 1
3 A 0
4 A 0
5 B 0
6 B 1
7 C 1
8 C 0
9 D 0
10 D 0

In [29]:
df.groupby('person')['cond'].apply( lambda x: x.loc[:x.idxmax()] if len(x[x==0]) != len(x) else x)

Out[29]:
person
A 0 0
1 0
2 1
B 5 0
6 1
C 7 1
D 9 0
10 0
Name: cond, dtype: int64

所以在这里我们测试所有值是否都是0,如果是,则返回该组,否则我们像以前一样进行切片

关于python - 如何在 Python 中使用 pandas 满足特定条件后删除观察结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42762599/

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