Python 我需要根据列上的值从pandas dataframe生成一个真值表

Python 我需要根据列上的值从pandas dataframe生成一个真值表,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据帧: 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 我如何将其转换为这样: name vals 0 foo X 1 foo Y 2 foo Z 3 bar Y 4 bar Z 5

我有这样一个数据帧:

  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
我如何将其转换为这样:

  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"],
                        })
IIUC

groupby

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

非常感谢您的快速回复。我也喜欢这个答案(-:参见问题9)
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