根据列中列表中的值选择pandas数据帧的各个部分

时间:2017-04-21 16:57:46

标签: python pandas dataframe

经过一段时间的搜索,我无法找到一个必须解决的常见问题的答案,所以欢迎指点。

我有一个数据框:

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文件。

2 个答案:

答案 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的答案是最快捷的方法。