gpt4 book ai didi

python-3.x - pandas:按列分组后如何获得第一个正数?

转载 作者:行者123 更新时间:2023-12-03 18:46:46 26 4
gpt4 key购买 nike

我有一个 Pandas 数据框,如:

      a    b   id
1 10 6 1
2 6 -3 1
3 -3 12 1 # First time id 1 has a b value over 10
4 4 23 2 # First time id 2 has a b value over 10
5 12 11 2
6 3 -5 2

如何创建一个首先采用 id 的新数据帧列然后第一次得到列 b超过 10,因此结果如下所示:
      a    b   id
1 -3 12 1
2 4 23 2

我有一个包含 2,000,000 行和大约 10,000 id 的数据框值,因此 for 循环非常慢。

最佳答案

使用第一快 boolean indexing 用于过滤然后 groupby + first :

df = df[df['b'] > 10].groupby('id', as_index=False).first()
print (df)
id a b
0 1 -3 12
1 2 4 23

如果在某些组中没有比 10 更大的值,则解决方案有点复杂。 - 需要用 duplicated 扩展掩码:
print (df)
a b id
1 7 6 3 <- no value b>10 for id=3
1 10 6 1
2 6 -3 1
3 -3 12 1
4 4 23 2
5 12 11 2
6 3 -5 2

mask = ~df['id'].duplicated(keep=False) | (df['b'] > 10)
df = df[mask].groupby('id', as_index=False).first()
print (df)
id a b
0 1 -3 12
1 2 4 23
2 3 7 6

计时 :
#[2000000 rows x 3 columns]
np.random.seed(123)
N = 2000000
df = pd.DataFrame({'id': np.random.randint(10000, size=N),
'a':np.random.randint(10, size=N),
'b':np.random.randint(15, size=N)})
#print (df)


In [284]: %timeit (df[df['b'] > 10].groupby('id', as_index=False).first())
10 loops, best of 3: 67.6 ms per loop

In [285]: %timeit (df.query("b > 10").groupby('id').head(1))
10 loops, best of 3: 107 ms per loop

In [286]: %timeit (df[df['b'] > 10].groupby('id').head(1))
10 loops, best of 3: 90 ms per loop

In [287]: %timeit df.query("b > 10").groupby('id', as_index=False).first()
10 loops, best of 3: 83.3 ms per loop

#without sorting a bit faster
In [288]: %timeit (df[df['b'] > 10].groupby('id', as_index=False, sort=False).first())
10 loops, best of 3: 62.9 ms per loop

关于python-3.x - pandas:按列分组后如何获得第一个正数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028015/

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