gpt4 book ai didi

python - 检查数据框元组中的值是否

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:42 24 4
gpt4 key购买 nike

我有一个巨大的数据框(38 milj 行):

df = pd.DataFrame({'I':[1,2,3,4], 'C':[80,160,240,80],
'F':[(1,2,3,4),(5,7,2),(9,6,2,5,7),(4,0,8,3,2)]})

C F I
0 80 (1, 2, 3, 4) 1
1 160 (5, 7, 2) 2
2 240 (9, 6, 2, 5, 7) 3
3 80 (4, 0, 8, 3, 2) 4

现在我想过滤掉 'F' 中包含数字 3 的行

给予:

     C                F  I
0 80 (1, 2, 3, 4) 1
3 80 (4, 0, 8, 3, 2) 4

是否有高性能、低内存使用率的方法来做到这一点?

我尝试了 np.equal((3), df['F'].values).all() 但这显然不起作用

最佳答案

如果性能很重要,请将 inlist comprehension 结合使用:

df = df[[3 in x for x in df['F']]]

或者:

df = df[df['F'].apply(set) >= set([3])]

print (df)
I C F
0 1 80 (1, 2, 3, 4)
3 4 80 (4, 0, 8, 3, 2)

性能(取决于匹配值的数量,以及 df 的长度):

#[40000 rows x 3 columns]
df = pd.concat([df] * 10000, ignore_index=True)


In [166]: %timeit df[[3 in x for x in df['F']]]
5.57 ms ± 132 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [167]: %timeit df[df['F'].apply(lambda x: 3 in x)]
12.2 ms ± 625 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [170]: %timeit df[df['F'].apply(set) >= set([3])]
29 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [171]: %timeit df[pd.DataFrame(df['F'].values.tolist()).eq(3).any(1)]
37.4 ms ± 248 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

更好的结构,比如创建了尖锐的@jpp:

from itertools import chain

lens = df['F'].str.len()
df = pd.DataFrame({
'I' : df['I'].values.repeat(lens),
'C' : df['C'].values.repeat(lens),
'F' : list(chain.from_iterable(df['F'].tolist()))
})
print (df)
I C F
0 1 80 1
1 1 80 2
2 1 80 3
3 1 80 4
4 2 160 5
5 2 160 7
6 2 160 2
7 3 240 9
8 3 240 6
9 3 240 2
10 3 240 5
11 3 240 7
12 4 80 4
13 4 80 0
14 4 80 8
15 4 80 3
16 4 80 2

关于python - 检查数据框元组中的值是否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52928822/

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