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

问题描述 投票:1回答:2

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

有帮助吗?

python pandas dataframe data-manipulation
2个回答
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
投票

你可以做

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
© www.soinside.com 2019 - 2024. All rights reserved.