我有一个巨大的数据框(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
现在,我想过滤掉3
中包含数字'F'
的行
提供:
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()
,但这显然不起作用
答案 0 :(得分:5)
如果性能很重要,则将in
与list 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
答案 1 :(得分:1)
您应该通过传递in
表达式来将apply
运算符与lambda
方法结合使用。
df[df['F'].apply(lambda x: 3 in x)]
输出
I C F
0 1 80 (1, 2, 3, 4)
3 4 80 (4, 0, 8, 3, 2)
答案 2 :(得分:1)
是否有高性能,低内存使用方式?
不,没有。一系列元组未矢量化。它由双层指针组成,不适用于Pandas / NumPy。您可以使用str
访问器或列表理解器之类的黑客工具。或者甚至尝试扩展到数据框:
mask = pd.DataFrame(df['F'].values.tolist()).eq(3).any(1)
print(mask)
0 True
1 False
2 False
3 True
dtype: bool
但是所有这些都很昂贵。为了提高性能,您应该在构建序列之前 改善数据的结构。
答案 3 :(得分:0)
在<select class="form-control">
<option value="0"></option>
<option value="1: 1" >Jr.</option>
<option value="2: 2">Sr.</option>
<option value="3: 3">I</option>
<option value="4: 4">II</option>
<option value="5: 5">III</option>
</select>
内进行简单应用即可达到目的
loc