经过一段时间的搜索,我无法找到一个必须解决的常见问题的答案,所以欢迎指点。
我有一个数据框:
df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C' : [['a','b'],['b','c'] ,['g','h'],['x','y']]})
并且我想选择其中的一些子集(某些行),这些子集在' C'中的列表中具有值。出现在我感兴趣的事物列表中的列,例如
listOfInterestingThings = [a, g]
所以当应用过滤器时,我会有一个df1:
df1 =
A B C
5 1 ['a','b']
3 3 ['g','h']
我正在处理的数据帧是以当前df格式导入RAM~12GB的大量原始数据。大约一半在磁盘上作为一系列json文件。
答案 0 :(得分:2)
我完全同意@DSM。
作为最后的手段,您可以使用:
In [21]: df.loc[pd.DataFrame(df.C.values.tolist(), index=df.index) \
.isin(listOfInterestingThings).any(1)]
Out[21]:
A B C
0 5 1 [a, b]
2 3 3 [g, h]
或:
In [11]: listOfInterestingThings = set(['a', 'g'])
In [12]: df.loc[df.C.apply(lambda x: len(set(x) & listOfInterestingThings) > 0)]
Out[12]:
A B C
0 5 1 [a, b]
2 3 3 [g, h]
说明:
In [22]: pd.DataFrame(df.C.values.tolist(), index=df.index)
Out[22]:
0 1
0 a b
1 b c
2 g h
3 x y
In [23]: pd.DataFrame(df.C.values.tolist(), index=df.index).isin(listOfInterestingThings)
Out[23]:
0 1
0 True False
1 False False
2 True False
3 False False
答案 1 :(得分:1)
这也有效:
df[list(np.any(('a' in i) | ('g' in i) for i in df.C.values))]
A B C
0 5 1 [a, b]
2 3 3 [g, h]
基准:
time df.loc[df.C.apply(lambda x: len(set(x) & listOfInterestingThings)> 0)]
CPU times: user 873 µs, sys: 193 µs, total: 1.07 ms
Wall time: 987 µs
time df[list(np.any(('a' in i) | ('g' in i) for i in df.C.values))]
CPU times: user 1.02 ms, sys: 224 µs, total: 1.24 ms
Wall time: 1.08 ms
time df.loc[pd.DataFrame(df.C.values.tolist(), index=df.index).isin(listOfInterestingThings).any(1)]
CPU times: user 2.58 ms, sys: 1.01 ms, total: 3.59 ms
Wall time: 5.41 ms
因此,简而言之,@ MaxU的答案是最快捷的方法。