python - 检查数据帧元组中的值是否
问题描述
我有一个巨大的数据框(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()
了,但这显然不起作用
解决方案
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
推荐阅读
- excel - 是否可以激活具有变量名的文件
- architecture - 在同一层或单独的层中实施访问控制?
- c++ - 检查一棵树是否只有奇数的函数 C++
- arrays - 映射多个数组并只返回特定的
- javascript - 使用按钮 onclick 填写表单中的字段
- python-3.x - 图片缩放没有选择正确的区域
- ionic-framework - ioinc 中显示 AdMob 横幅时屏幕闪烁?
- javascript - 我可以使用 JavaScript 变量将 document.write 用于另一个 html 标记吗?
- java - 如何解析所需的位置 sample.fxml
- c - 确定给定用户内存大小和偏移量的所有可能的 32KB 块数