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