Мне нужно сделать таблицу истинности из pandas dataframe на основе значений в столбце - PullRequest
0 голосов
/ 08 июня 2018

У меня есть такой кадр данных:

  name vals
0  foo    X
1  foo    Y
2  foo    Z
3  bar    Y
4  bar    Z
5  bar    Q

Как я могу преобразовать его так:

      Q  X  Y  Z
name            
foo   0  1  1  1
bar   1  0  1  1

Код для первого df:

df = pd.DataFrame({"name": ["foo", "foo", "foo",
                              "bar", "bar", "bar"],
                        "vals": ["X", "Y", "Z",
                              "Y", "Z", "Q"],
                        })

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

groupby

df.groupby(['name', 'vals']).size().unstack(fill_value=0)


vals  Q  X  Y  Z
name            
bar   1  0  1  1
foo   0  1  1  1vals  Q 

pd.factorize и назначение среза

Это назначит один для существования, но не подсчитает общее вхождение

i, r = pd.factorize(df.name)
j, c = pd.factorize(df.vals)
b = np.zeros((r.size, c.size), int)
b[i, j] = 1

pd.DataFrame(b, r, c)

     X  Y  Z  Q
foo  1  1  1  0
bar  0  1  1  1

pd.factorize и np.bincount

i, r = pd.factorize(df.name)
j, c = pd.factorize(df.vals)
n, m = len(r), len(c)
b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)

pd.DataFrame(b, r, c)

     X  Y  Z  Q
foo  1  1  1  0
bar  0  1  1  1
0 голосов
/ 08 июня 2018

IIUC

pd.crosstab(df.name,df.vals)
Out[137]: 
vals  Q  X  Y  Z
name            
bar   1  0  1  1
foo   0  1  1  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...