2017-04-21 154 views
0

经过一段时间的搜索后,我找不到必须是常见问题的答案,因此欢迎使用指针。根据列中列表中的值选择熊猫数据帧的部分

我有一个数据帧:

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'] 

我处理的数据帧是一个巨大的原始数据导入到RAM 12GB〜在当前DF形式。大约是磁盘上的一半,作为一系列json文件。

+3

标准警告:Series和DataFrames中的非标量元素(例如列表)没有很好的支持,并可能导致神秘和意外的行为。警告用具! – DSM

+0

@DSM有趣。不知道。你有什么建议吗?我正在做的是在尝试使用一些ML来训练主题之前对大型文本语料库进行基本操作。数据〜6GB的json文件。每个文档由一个带有“body”和“topics”标签的json元素表示,主题以列表形式呈现,例如['topic1','topic2']我用pd.DataFrame.from_dict将数据加载到df。你有没有更好的方法来处理这种结构的大数据集? –

回答

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

这也适用于:

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

相关问题