2017-04-21 1 views
0

검색하는 동안 일반적인 문제 일 수있는 답변을 찾을 수 없으므로 포인터를 환영합니다.열의 목록에있는 값을 기반으로 판다 데이터 프레임의 일부를 선택하십시오.

I는 dataframe 가지고

df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C' : [['a','b'],['b','c'] ,['g','h'],['x','y']]}) 

및 I가리스트에 나타나는 'C'열의 목록의 값을 그 서브 세트 (행의 일부)을 선택하고자 내가 관심있는 것들. 예. 필터가 나는 DF1있을 것입니다 적용 그래서

listOfInterestingThings = [a, g] 

:

내가 처리하고있어 dataframe 현재 안양 형태 ~ 12기가바이트을 RAM으로 대규모 원시 데이터 가져 오기가
df1 = 
A B  C  
5 1 ['a','b'] 
3 3 ['g','h'] 

. 디스크의 절반 정도가 일련의 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] 
,451,515,

벤치 마크 :

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의 대답은 가장 빠른 방법입니다 @.

관련 문제