Pandalar veri çerçevesinden çok değerli kategorik değişkeni ikili olarak nasıl kodlayabilirim?


9

Belirli bir sütun için birden fazla değere sahip aşağıdaki veri çerçevesine sahip olduğumuzu varsayalım:

    categories
0 - ["A", "B"]
1 - ["B", "C", "D"]
2 - ["B", "D"]

Böyle bir masayı nasıl alabiliriz?

   "A"  "B"  "C"  "D"
0 - 1    1    0    0
1 - 0    1    1    1
2 - 0    1    0    1

Not: Mutlaka yeni bir veri çerçevesine ihtiyacım yok, bu tür DataFrame'lerin makine öğrenimi için daha uygun bir biçime nasıl dönüştürüleceğini merak ediyorum.

Yanıtlar:


7

Eğer [0, 1, 2]sayısal etiketler, ve dizin değil, o zaman pandas.DataFrame.pivot_tableçalışır:

İçinde []:
data = pd.DataFrame.from_records (
    [[0, 'A'], [0, 'B'], [1, 'B'], [1, 'C'], [1, 'D'], [2, 'B'], [ 2, 'D']],
    column = ['number_label', 'kategori'])
data.pivot_table (index = ['number_label'], sütunlar = ['kategori'], aggfunc = [len], dolgu_değeri = 0)
Dışarı[]:
              len
kategori ABCD
numara_etiketi                       
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

Bu blog yayını yardımcı oldu: http://pbpython.com/pandas-pivot-table-explained.html


Eğer [0, 1, 2]endeks, sonra collections.Counteryararlıdır:

İçinde []:
data2 = pd.DataFrame.from_dict (
    {'kategoriler': {0: ['A', 'B'], 1: ['B', 'C', 'D'], 2: ['B', 'D']}})
data3 = data2 ['kategoriler']. uygula (collections.Counter)
pd.DataFrame.from_records (data3) .fillna (değeri = 0)
Dışarı[]:
       ABCD
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

Teşekkürler, kontrol edeceğim. Aslında, 0, 1 ve 2 indekstir. Ayrıca, burada çok fazla sıfır olduğu için, seyrekliğin nasıl verimli bir şekilde ele alınabileceği hakkında bir fikriniz var mı?
Denis L

Hem pandalar hem de scipy, bellek tasarrufu için seyrek veri yapılarına ( pandalar seyrek , scipy seyrek ) sahiptir, ancak kullandığınız makine öğrenme kütüphanesi tarafından desteklenmeyebilir. Sorununuzun boyutsallığı (sütun sayısı) o kadar büyükse, seyrek sunum gerekliyse, boyutsallık azaltma tekniklerini de kullanmayı düşünebilirsiniz .
Samuel Harrold
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.