Pandalar veri çerçevesinde satırlar üzerinde yineleme yaparak yeni sütunlar oluşturma


10

Böyle bir pandalar veri çerçevesi (X11) var: Aslında dx99 kadar 99 sütun var

    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 vb. Hücre değerleri için ek sütun (lar) oluşturmak istiyorum. Yani herhangi bir dxs sütununda 25041 söz konusu satırda 25041 oluşursa 1 veya 0 değeri olan bir 25041 sütunu olacaktır. Bu kodu kullanıyorum ve satır sayısı az olduğunda çalışır.

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)

Ben böyle sonuç alıyorum:

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

Satır sayısı binlerce veya milyonlarca olduğunda, askıda kalıyor ve sonsuza dek sürüyor ve sonuç alamıyorum. Lütfen hücre değerlerinin sütuna özgü olmadığını, bunun yerine çoklu sütunlarda tekrarlandığını görün. Örneğin, 40391, dx1'de olduğu gibi dx2'de de 0 ve 5856 vb. İçin meydana gelir.


bunu nasıl çözeceğimize dair bir fikri olan? Verilerimin gittikçe büyümesi ve mevcut çözümün oluşturulan kukla sütunlara kadar sürmesi nedeniyle hala çözülmesini bekliyorum.
Sanoj

Yanıtlar:


6

Pandalarda çok daha pythonic bir çözüm var ...

Bu, dizüstü bilgisayarımdaki 10 Milyon satırda bir saniyeden az sürüyor:

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

Aşağıda ayrıntıları verilmiştir:

Basit küçük veri çerçevesi -

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

basit küçük veri çerçevesi

İkilileştirme yöntemi -

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

resim açıklamasını buraya girin

10 Milyon Satırlı Veri Çerçevesi -

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

resim açıklamasını buraya girin

10 milyon sıralı veri çerçevesinde zamanlanmış ikilileştirme (diğer adıyla sıcak kodlama) -

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

resim açıklamasını buraya girin

Bu yardımcı olur umarım!


Bu, hem for döngüsünde kukla değeri (25041) ve sütun adlarını (yani dx1) dinamik olarak nasıl alacağınızı söylemez. Bir seferde sadece bir tane alabilirim.
Sanoj

Şimdi bir göz atın. Tüm detayları ekledim.
AN6U5

Yalnızca "E" den yaptığınız gibi bir sütuna dayalı kukla değerler oluşturmam gerekirse çözümünüz iyi görünüyor. Ancak birden çok sütundan oluşturmak zorunda olduğumda ve bu hücre değerleri belirli bir sütuna özgü olmadığında, tüm bu sütunlar için kodunuzu tekrar döngüye almam gerekir mi? Eğer durum buysa, değerlerin tekrarına nasıl dikkat edilir? Aksi takdirde, aynı adla oluşturulan önceki kukla sütunun üzerine yazılır. Herhangi bir karışıklık olup olmadığını netleştirmek için yukarıdaki sonucumu ekledim. Yine de baktığın için teşekkürler.
Sanoj

4

Bir panda veri çerçevesi sütunundan kukla değişken oluşturmak istediğiniz anlaşılıyor. Neyse ki, pandalar bunun için özel bir yöntem vardır: get_dummies(). İhtiyacınıza göre uyarlayabileceğiniz bir kod snippet'i:

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]

İşte çıktı 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  

Tamam görünüyor ama dikkatlice görecek olursanız değer_0 için tüm satırlarda 1 olmadığını görürsünüz. 0 tüm satırlarda bulunduğundan, değer_0 öğesinin tüm satırda 1 olması gerekir. Değer_5856, Değer_25081 vb. İçin de aynıdır.
Sanoj

Merhaba Sanoj. Çözümümü kullanmak ve beni oylamak gerçekten adil değil. Yapabileceğiniz en az şey, sorunuzu yeni bir soru açmak yerine kaydettiğiniz yeni ilerlemeyle güncellemektir. İnsanların size yardım etmesini istiyorsanız, onlarla iyi oynamalısınız.
michaelg

Merhaba michaeld: Seni oylama niyetim yoktu. Bu çözüm söz konusu sorularımı istediğim gibi karşılamadığı için tıklama işaretini çıkardım. Başlangıçta iyi düşündüm ama daha sonra araştırdığımda yukarıdaki cevapta belirtildiği gibi tutarsızlıklar buldum. Bu konuda herhangi bir cevap alamıyordum, bu yüzden orijinal cevabımdan bahsettiğim ve cevabınızı gerekli düzeltmeyi eklediğim yeni bir soru oluşturdum. Üzgünüm, orada isminden bahsetmedim. Bunu güncelleyeceğim.
Sanoj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.