gpt4 book ai didi

python - 有比 groupby 更快的遍历组的方法吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:28:56 25 4
gpt4 key购买 nike

所以我将之前的问题缩小到这个:我有一个看起来像这样的 DataFrame

              id  temp1  temp2
9 10.0 True False
10 10.0 True False
11 10.0 False True
12 10.0 False True
17 15.0 True False
18 15.0 True False
19 15.0 True False
20 15.0 True False
21 15.0 False False
33 27.0 True False
34 27.0 True False
35 27.0 False True
36 27.0 False False
40 31.0 True False
41 31.0 False True
.
.
.

实际上,它有几百万行长(还有其他几列)。

我目前正在做的是

    grouped = coinc.groupby('id')
final = grouped.filter(lambda x: ( x['temp2'].any() and x['temp1'].any()))
lanif = final.drop(['temp1','temp2'],axis = 1 )

(coinc 是数据框的名称)

如果某些具有相同 ID 的行在 temp1 和 temp2 中都为真,则只保留行(按 id 分组)。例如,对于上面的数据框,它会删除 ID 为 15 的行,但保留其他所有内容。

然而,这非常慢,我想知道是否有更快的方法来做到这一点。

最佳答案

在这里使用带有 lambda 函数的 filter 会大大降低您的速度。您可以通过删除它来加快速度。


u = coinc.groupby('id')
m = u.temp1.any() & u.temp2.any()
res = df.loc[coinc.id.isin(m[m].index), ['id']]

将此与您在更大框架上的方法进行比较。

a = np.random.randint(1, 1000, 100_000)
b = np.random.randint(0, 2, 100_000, dtype=bool)
c = ~b

coinc = pd.DataFrame({'id': a, 'temp1': b, 'temp2': c})

In [295]: %%timeit
...: u = coinc.groupby('id')
...: m = u.temp1.any() & u.temp2.any()
...: res = coinc.loc[coinc.id.isin(m[m].index), ['id']]
...:
13.5 ms ± 476 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [296]: %%timeit
...: grouped = coinc.groupby('id')
...: final = grouped.filter(lambda x: ( x['temp2'].any() and x['temp1'].any()))
...: lanif = final.drop(['temp1','temp2'],axis = 1 )
...:
527 ms ± 7.91 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

np.array_equal(res.values, lanif.values)

True

关于python - 有比 groupby 更快的遍历组的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56468055/

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