팬더 데이터 프레임에서 행을 반복하여 새 열 만들기


10

나는 팬더 데이터 프레임 (X11)을 다음과 같이 가지고있다 : 실제로 99 개의 열을 dx99까지 가지고있다.

    dx1      dx2    dx3    dx4
0   25041   40391   5856    0
1   25041   40391   25081   5856
2   25041   40391   42822   0
3   25061   40391   0       0
4   25041   40391   0       5856
5   40391   25002   5856    3569

25041,40391,5856 등과 같은 셀 값에 대한 추가 열을 만들고 싶습니다. 따라서 dxs 열의 특정 행에서 25041이 발생하면 값이 1 또는 0 인 열 25041이 있습니다. 이 코드를 사용하고 있으며 행 수가 적을 때 작동합니다.

mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)

for x in values:
    X11[x] = X11.isin([x]).any(1).astype(int)

나는 다음과 같은 결과를 얻고있다 :

dx1     dx2     dx3    dx4  0   25002   25041   25061   25081   3569    40391   42822   5856
25041   40391   5856    0   0   0       1       0       0       0          1        0       1
25041   40391   25081  5856 0   0       1       0       1       0            1      0       1
25041   40391   42822   0   0   0       1       0       0       0           1       1       0
25061   40391   0       0   0   0       0       1       0       0          1        0       0
25041   40391   0    5856   0   0       1       0       0       0          1        0       1
40391   25002 5856   3569   0   1       0       0       0       1          1        0       1

행 수가 수천 또는 수백만 개일 때 행이 끊어지고 영원히 걸리며 결과가 없습니다. 셀 값은 열에 고유하지 않고 여러 열에서 반복됩니다. 예를 들어, 40391은 dx2와 dx2 등에서 0과 5856 등에서 발생합니다. 위에서 언급 한 논리를 개선하는 방법에 대한 아이디어가 있습니까?


어떻게 해결할 수 있습니까? 데이터가 점점 커지고 기존 솔루션이 더미 열을 생성하는 데 시간이 오래 걸리기 때문에 여전히이 문제가 해결되기를 기다리고 있습니다.
Sanoj

답변:


6

팬더에는 훨씬 더 많은 파이썬 솔루션이 있습니다 ...

내 노트북의 천만 행에 1 초도 걸리지 않습니다.

for x in X11.E.unique():
    X11[x]=(X11.E==x).astype(int)
X11

자세한 내용은 다음과 같습니다.

간단한 작은 데이터 프레임-

import numpy as np
import pandas as pd

X11 = pd.DataFrame(np.random.randn(6,4), columns=list('ABCD'))
X11['E'] = [25223, 112233,25223,14333,14333,112233]
X11

간단한 작은 데이터 프레임

이진화 방법-

for x in X11.E.unique():
    X11[x]=(X11.E==x).astype(int)
X11

여기에 이미지 설명을 입력하십시오

천만 개의 행이있는 데이터 프레임-

pd.set_option("display.max_rows",20)
X12 = pd.DataFrame(np.random.randn(10000000,4), columns=list('ABCD'))
foo = [25223, 112233,25223,14333,14333,112233]
bar=[]
import random
for x in range(10000000):
    bar.append(random.choice(foo))
X12['E'] = bar
X12

여기에 이미지 설명을 입력하십시오

천만 개의 행 데이터 프레임에서 시간 이진화 (일명 원 인코딩)

import time
start = time.clock()

for x in X12.E.unique():
    X12[x]=(X12.E==x).astype(int)
elapsed = (time.clock() - start)

print "This is the time that this took in seconds: ",elapsed

X12

여기에 이미지 설명을 입력하십시오

도움이 되었기를 바랍니다!


이것은 for 루프에서 어떻게 더미 값 (25041)과 열 이름 (예 : dx1)을 동적으로 얻는지를 말하지 않습니다. 한 번에 하나만 얻을 수 있습니다.
Sanoj

지금보세요. 모든 세부 사항을 추가했습니다.
AN6U5

"E"에서 한 것처럼 하나의 열을 기반으로 더미 값을 작성 해야하는 경우 솔루션이 좋아 보입니다. 그러나 여러 열에서 생성해야하고 해당 셀 값이 특정 열에 고유하지 않은 경우 모든 열에 대해 코드를 다시 루프해야합니까? 그렇다면 값의 반복을 어떻게 처리 할 것인가? 그렇지 않으면 동일한 이름으로 생성 된 이전 더미 열을 덮어 씁니다. 위의 질문에 결과를 추가하여 혼란이 있는지 확인했습니다. 어쨌든 조사해 주셔서 감사합니다.
Sanoj

4

팬더 데이터 프레임 열에서 더미 변수를 만들고 싶은 것 같습니다. 다행히 팬더에는 특별한 방법이 있습니다 get_dummies(). 다음은 필요에 맞게 조정할 수있는 코드 스 니펫입니다.

import pandas as pd
data = pd.read_clipboard(sep=',')

#get the names of the first 3 columns
colN = data.columns.values[:3]

#make a copy of the dataframe
data_transformed = data

#the get_dummies method is doing the job for you
for column_name in colN:
    dummies = pd.get_dummies(data_transformed[column_name], prefix='value', prefix_sep='_')
    col_names_dummies = dummies.columns.values

    #then you can append new columns to the dataframe
    for i,value in enumerate(col_names_dummies):
        data_transformed[value] = dummies.iloc[:,i]

출력은 다음과 같습니다 data_transformed.

         dx1    dx2    dx3   dx4    dx5    dx6    dx7  value_25041  value_25061  0  25041  40391   5856     0  V4511  V5867  30000            1            0   
    1  25041  40391  25081  5856   5363   3572      0            1            0   
    2  25041  40391  42822     0   5856      0      0            1            0   
    3  25061  40391      0     0      0      0      0            0            1   
    4  25041  40391      0  5856  25081  V4511  25051            1            0   

      value_40391  value_0  value_5856  value_25081  value_42822  
    0            1        0           1            0            0  
    1            1        0           0            1            0  
    2            1        0           0            0            1  
    3            1        1           0            0            0  
    4            1        1           0            0            0  

괜찮아 보이지만 조심스럽게 보면 value_0에 대해 모든 행에 1이없는 것을 알 수 있습니다. 0은 모든 행에 존재하므로 value_0은 모든 행에 1을 가져야합니다. value_5856, Value_25081 등과 동일합니다.이 논리는 열에서 값을 선택하고 다시 돌아 가지 않는 것 같습니다.
Sanoj

안녕 Sanoj. 내 솔루션을 사용하고 투표하지 않는 것이 실제로 공평하지 않습니다. 당신이 할 수있는 최소한의 일은 새로운 질문을 여는 대신 새로운 진보로 질문을 업데이트하는 것입니다. 사람들이 당신을 돕기를 원한다면 그들과 잘 놀아 주어야합니다.
michaelg

마이클 마이클 : 투표 할 의사가 없었습니다. 이 솔루션이 문제의 요구에 따라 내 요구를 충족시키지 못했기 때문에 클릭 기호를 제거했습니다. 처음에는 괜찮다고 생각했지만 나중에 조사했을 때 위의 답변에서 언급 한 바와 같이 불일치를 발견했습니다. 이에 대한 답변을 얻지 못했기 때문에 원래 답변을 언급하고 수정이 필요한 답변을 포함시키는 새 질문을 만들었습니다. 미안하지만 거기에 당신의 이름을 언급하지 않았습니다. 업데이트하겠습니다.
Sanoj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.