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