2017-12-29 16 views
0

이 질문은 this one과 비슷하지만 차이점은 하나의 값 대신 하나의 데이터 프레임 열에 값 목록이 있음을 의미합니다.팬더에서 일회용 코드를 효율적으로 수행하는 방법

words이라는 열이있는 팬더 데이터 프레임이 있다고 가정 해 봅니다. 여기에는 문서에서 사용할 수있는 단어 색인이 포함됩니다. 예를 들어 다음 데이터 프레임에는 첫 번째 단어에 ['a','b']이 포함되고 두 번째 단어에는 ['a','c','d']이 포함 된 두 개의 문서가 있습니다.

df = pd.DataFrame() 
df['words'] = [['a','b'],['a','c','d']] 

나는 각 단어에 대해, 다른 바이너리 컬럼에 하나 개의 컬럼을 words 열을 변환 할. 위의 dataframe가 변환됩니다 : 지금

df['a'] = [True, True] 
df['b'] = [True, False] 
df['c'] = [False, True] 
df['d'] = [False, True] 

, 나는 그것이 words 열에서 다른 단어를 사용할 수 w를 통해 반복 할 다음과 같은 코드를 가지고있다.

df[w] = [w in word_list for word_list in df['words']] 

분명히 매우 느립니다. 이 작업을 수행하는 효율적인 방법이 있습니까?

+0

[이 해결책] (https://stackoverflow.com/a/45684296/5741205) – MaxU

답변

2

한 가지 방법은 문자열에 |이없는 가정, get_dummies

In [31]: pd.get_dummies(df.words.apply(pd.Series).stack()).sum(level=0).astype(bool) 
Out[31]: 
     a  b  c  d 
0 True True False False 
1 True False True True 

또 다른 방법을 사용하거나 하나의 값에 대한 다른 분리

In [50]: df.words.str.join('|').str.get_dummies('|').astype(bool) 
Out[50]: 
     a  b  c  d 
0 True True False False 
1 True False True True 

을 사용하는 것입니다.

In [68]: df['a'] = df.words.apply(lambda x: 'a' in x) # or ['a' in x for x in df.words] 
+0

감사합니다. 좋은 대답입니다. 그건 그렇고, 내 데이터 프레임은 약 100M 행을 가지고 있으며 약 2000 개의 별개의 단어가 있습니다. 이것은 여전히 ​​매우 느리고 메모리 오류로 어려움을 겪을 수 있습니다. 'a'와 같은 한 단어에 대해서만 어떻게 열을 생성 할 수 있습니까? – Hossein

+0

솔루션을 업데이트했습니다. 그리고 그 대용량 데이터의 경우 목록에 열을 저장하는 것은 매우 비효율적입니다. – Zero

+0

'df.words.apply'는 제가 질문에서 언급 한 것보다 효율적이지 않은 것 같습니다 (그리고 주석으로 추가했습니다). 열에 목록을 저장하는 방법에 대한 다른 방법이 있습니까? – Hossein