gpt4 book ai didi

python - Pandas :如果至少其中一排包含特定值,则保留行

转载 作者:太空狗 更新时间:2023-10-30 00:43:05 25 4
gpt4 key购买 nike

我在 Pandas 中有以下数据框

letter  number
------ -------
a 2
a 0
b 1
b 5
b 2
c 1
c 0
c 2

如果至少有一个匹配数字为 0,我想保留所有行。结果将是:

letter  number
------ -------
a 2
a 0
c 1
c 0
c 2

因为 b 没有匹配的数字是 0

最好的方法是什么?谢谢!

最佳答案

你需要filtration :

df = df.groupby('letter').filter(lambda x: (x['number'] == 0).any())
print (df)
letter number
0 a 2
1 a 0
5 c 1
6 c 0
7 c 2

另一种解决方案 transform其中获取 0 行的大小并按 boolean indexing 过滤:

print (df.groupby('letter')['number'].transform(lambda x: (x == 0).sum()))
0 1
1 1
2 0
3 0
4 0
5 1
6 1
7 1
Name: number, dtype: int64

df = df[df.groupby('letter')['number'].transform(lambda x: (x == 0).sum()) > 0]
print (df)
letter number
0 a 2
1 a 0
5 c 1
6 c 0
7 c 2

编辑:

更快的是不使用groupby,更好的是locisin :

df1 = df[df['letter'].isin(df.loc[df['number'] == 0, 'letter'])]
print (df1)
letter number
0 a 2
1 a 0
5 c 1
6 c 0
7 c 2

与另一个解决方案比较:

In [412]: %timeit df[df['letter'].isin(df[df['number'] == 0]['letter'])]
1000 loops, best of 3: 815 µs per loop

In [413]: %timeit df[df['letter'].isin(df.loc[df['number'] == 0, 'letter'])]
1000 loops, best of 3: 657 µs per loop

关于python - Pandas :如果至少其中一排包含特定值,则保留行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43184106/

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