将交叉表值与数据框连接起来?

Concatenate cross tab values with dataframe?

我有一个以下类型的数据框 df

ID   Result Other_val
1    A      y
2    B      x
2    A      x
3    C      abc

使用pd.crosstab(df.ID, df.Result)后,我得到了这样的交叉表:

Result  A  B  C
ID
1       1  0  0
2       1  1  0
3       0  0  1

我现在希望将这些值连接到原始数据框的末尾(在删除已经存在的 Result 列之后)以获得如下内容:

ID   A   B   C   Other_val
1    1   0   0   y
2    1   1   0   x
3    0   0   1   abc

然而,我很难过。我似乎无法使用 pd.concat() 来形成上面的 table,因为交叉表 table 的索引方式很奇怪。

有什么帮助吗?

我想你要找的是pd.crosstab([df.ID, df.Other_val], df.Result),因为你需要分组ID和Other_val。

In [5]: pd.crosstab([df.ID, df.Other_val], df.Result)
Out[5]: 
Result        A  B  C
ID Other_val         
1  y          1  0  0
2  x          1  1  0
3  abc        0  0  1

你可以做到

df2 = pd.crosstab(df.ID, df.Result)

然后

df_final = df.drop('Result', axis=1).drop_duplicates('ID').join(df2, on='ID')

这给出了

   ID Other_val  A  B  C
0   1         y  1  0  0
1   2         x  1  1  0
3   3       abc  0  0  1

如果您想对列重新排序,您将获得想要的结果

df_final = df_final[['ID', 'A', 'B', 'C', 'Other_val']]

   ID  A  B  C Other_val
0   1  1  0  0         y
1   2  1  1  0         x
3   3  0  0  1       abc

你也可以这样使用concat

pd.concat([df.drop('Result', axis=1).drop_duplicates('ID').set_index('ID'), df2], axis=1)

   Other_val  A  B  C
ID                   
1          y  1  0  0
2          x  1  1  0
3        abc  0  0  1