使用数据框连接交叉表值?

时间:2017-12-16 00:43:30

标签: python pandas dataframe data-manipulation

我有以下类型的数据框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()来形成上表,因为交叉表的索引方式很奇怪。

有任何帮助吗?

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找的是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

答案 1 :(得分: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