2016-09-27 8 views
4

저는 다양한 열 (각각은 코퍼스에서 단어의 빈도를 나타냄)을 가진 팬더 DF를 가지고 있습니다. 각 행은 문서에 해당하며 각 행은 float64 유형입니다. 예Binaryize a float64 Pandas Dataframe in Python

는 :

word1 word2 word3 
0.0 0.3 1.0 
0.1 0.0 0.5 
etc 

I이를 이진화하고자 대신 주파수의 부울 (0과 1 DF)로 끝날 즉

그래서 단어 상기 예들의 존재를 나타낸다

word1 word2 word3 
0  1  1 
1  0  1 
etc 

나는 get_dummies()를 보았지만 출력이 예상과 달랐습니다.

답변

0

코드 :

import numpy as np 
import pandas as pd 

""" create some test-data """ 
random_data = np.random.random([3, 3]) 
random_data[0,0] = 0.0 
random_data[1,2] = 0.0 

df = pd.DataFrame(random_data, 
    columns=['A', 'B', 'C'], index=['first', 'second', 'third']) 

print(df) 

""" binarize """ 
threshold = lambda x: x > 0 
df_ = df.apply(threshold).astype(int) 

print(df_) 

출력 :

A   B   C 
first 0.000000 0.610263 0.301024 
second 0.728070 0.229802 0.000000 
third 0.243811 0.335131 0.863908 
A B C 
first 0 1 1 
second 1 1 0 
third 1 1 1 

비고 :

  • get_dummies() 열마다 각각의 고유 한 값을 분석하고 (각각의 고유 한 값) 새 열을 소개합니다 이 값이 활성화되어 있으면 표시
  • = A 열에 20 개의 고유 한 값이있는 경우 단말은, 20 새로운 열이 정확히 하나의 열이 사실이고, 다른 사람은 어떤 제로 항목에 대한 제로 — 및 False없는 아무것도 True가 발생합니다 부울로 캐스팅
5

거짓, 추가됩니다. 그런 다음 정수로 변환하면 1과 0이됩니다.

import io 
import pandas as pd 

data = io.StringIO('''\ 
word1 word2 word3 
0.0 0.3 1.0 
0.1 0.0 0.5 
''') 
df = pd.read_csv(data, delim_whitespace=True) 

res = df.astype(bool).astype(int) 
print(res) 

출력 :

word1 word2 word3 
0  0  1  1 
1  1  0  1 
1

@Alberto 가르시아 - Raboso 대답으로 내가 대답했을 것이다 그러나 여기에서 매우 빠른이며, 같은 생각을 활용 대안입니다.

사용 np.where

pd.DataFrame(np.where(df, 1, 0), df.index, df.columns) 

enter image description here


타이밍

enter image description here

0

는 팬더 색인을 사용하여 다른 방법을 찾아 냈다.

이 단순히 간단

df[df>0] = 1 

하여 수행 할 수 있습니다!

관련 문제