pandas使用值中的名称创建列,并用True/False替换

2024-10-06 07:46:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

df = pd.DataFrame({"id":[1, 1, 1, 2, 2, 2, 2, 3, 3], "val":["A12", "B23", "C34", "A12", "C34", "E45", "F56", "G67", "B23"]})
print(df)
   id  val
0   1  A12
1   1  B23
2   1  C34
3   2  A12
4   2  C34
5   2  E45
6   2  F56
7   3  G67
8   3  B23

我如何将它转换成这样

   id  A12  B23  C34  E45  F56  G67
0   1    1    1    1    0    0    0
1   2    1    0    1    1    1    0
2   3    0    1    0    0    0    1

我尝试了pivot和unstack,但由于每个“id”的“val”列中的值数量可能不同,因此我无法创建列的主列表,然后以某种方式填充这些列中的值。请帮忙


Tags: 数据iddataframedfvalpdpivotprint
3条回答

尝试交叉表:

pd.crosstab(df.id, df.val).reset_index()

您可以使用^{}^{}

print( pd.concat([df, pd.get_dummies(df['val'])], axis=1).groupby('id').sum().reset_index() )

印刷品:

   id  A12  B23  C34  E45  F56  G67
0   1    1    1    1    0    0    0
1   2    1    0    1    1    1    0
2   3    0    1    0    0    0    1

get_dummiesgroupby的另一种方式:

(pd.get_dummies(df.val)
   .groupby(df['id'])
   .sum()
   .reset_index()
)

set_indexget_dummies

(pd.get_dummies(df.set_index('id').val)
   .sum(level='id')
   .reset_index()
)

输出:

   id  A12  B23  C34  E45  F56  G67
0   1    1    1    1    0    0    0
1   2    1    0    1    1    1    0
2   3    0    1    0    0    0    1

相关问题 更多 >