Jak binarnie kodować wielowartościową zmienną kategorialną z ramki danych Pandas?

9

Załóżmy, że mamy następującą ramkę danych z wieloma wartościami dla pewnej kolumny:

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

Jak możemy uzyskać taki stół?

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

Uwaga: niekoniecznie potrzebuję nowej ramki danych, zastanawiam się, jak przekształcić takie ramki danych w format bardziej odpowiedni do uczenia maszynowego.

Denis L.
źródło

Odpowiedzi:

7

Jeśli [0, 1, 2]są etykietami numerycznymi i nie są indeksem, to pandas.DataFrame.pivot_tabledziała:

W []:
data = pd.DataFrame.from_records (
    [[0, „A”], [0, „B”], [1, „B”], [1, „C”], [1, „D”], [2, „B”], [ 2, „D”]],
    kolumny = [„numer_etykiety”, „kategoria”])
data.pivot_table (index = ['number_label'], columns = ['category'], aggfunc = [len], fill_value = 0)
Na zewnątrz[]:
              Len
kategoria ABCD
numer_etykiety                       
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

Ten post na blogu był pomocny: http://pbpython.com/pandas-pivot-table-explained.html


Jeśli [0, 1, 2]jest indeksem, to collections.Counterjest przydatne:

W []:
data2 = pd.DataFrame.from_dict (
    {„kategorie”: {0: [„A”, „B”], 1: [„B”, „C”, „D”], 2: [„B”, „D”]}})
data3 = data2 [„kategorie”]. zastosowanie (collections.Counter)
pd.DataFrame.from_records (data3) .fillna (wartość = 0)
Na zewnątrz[]:
       ABCD
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1
Samuel Harrold
źródło
Dzięki, sprawdzę to. W rzeczywistości 0, 1 i 2 są indeksem. Czy masz również pojęcie, jak można skutecznie radzić sobie z rzadkością, ponieważ istnieje wiele zer?
Denis L
Zarówno pandy, jak i scipy mają rzadkie struktury danych ( pandy rzadkie , scipy rzadkie ) w celu oszczędzania pamięci, ale mogą nie być obsługiwane przez używaną bibliotekę uczenia maszynowego. Jeśli wymiarowość twojego problemu (liczba kolumn) jest tak duża, że ​​konieczna jest rzadka reprezentacja, możesz rozważyć zastosowanie również technik redukcji wymiarowości .
Samuel Harrold