Панды - объединить несколько категориальных столбцов в один набор столбцов - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть следующий фрейм данных:

import pandas as pd
data = {
    'Num' : ['1','2', '3','4','5','6','7'],
    'col1': ['val1', 'val6', 'val3', 'val7', 'val2','val4','val5'],
    'col2': ['','val3','val5','','','',''],
    'col3': ['','val1','val2','','','','']
}
df = pd.DataFrame(data)
df["myvals"]=1

   Num  col1    col2    col3    myvals
0   1   val1                      1
1   2   val6    val3    val1      1
2   3   val3    val5    val2      1
3   4   val7                      1
4   5   val2                      1
5   6   val4                      1
6   7   val5                      1

Я пытаюсь перенести значения из 'col1', 'col2' и 'col3' в один и тот же набор 'поворотных столбцов', но до сих пор я могу захватывать только значения из' col1 ':

pd.pivot_table(df, values="myvals", index=["Num"], columns="col1", fill_value=0)

    col1    val1    val2    val3    val4    val5    val6    val7
    Num                         
    1         1       0       0       0      0        0       0
    2         0       0       0       0      0        1       0
    3         0       0       1       0      0        0       0
    4         0       0       0       0      0        0       1
    5         0       1       0       0      0        0       0
    6         0       0       0       1      0        0       0
    7         0       0       0       0      1        0       0

Любые идеи о том, как также ввести значения из' col2 'и' col3 ', выглядят какниже, где строки для 'Num' = 2 и 'Num' = 3 должны иметь несколько единиц?

col1    val1    val2    val3    val4    val5    val6    val7
Num                         
1         1       0       0       0      0        0       0
2         1       0       1       0      0        1       0
3         0       1       1       0      1        0       0
4         0       0       0       0      0        0       1
5         0       1       0       0      0        0       0
6         0       0       0       1      0        0       0
7         0       0       0       0      1        0       0

1 Ответ

0 голосов
/ 21 сентября 2018

Это больше похоже на get_dummies проблему

df.replace('',np.nan).set_index('Num').stack().str.get_dummies().sum(level=0)
Out[1125]: 
     val1  val2  val3  val4  val5  val6  val7
Num                                          
1       1     0     0     0     0     0     0
2       1     0     1     0     0     1     0
3       0     1     1     0     1     0     0
4       0     0     0     0     0     0     1
5       0     1     0     0     0     0     0
6       0     0     0     1     0     0     0
7       0     0     0     0     1     0     0
...