我有一个数据框:
df
ID 0 1 2 3 4 ....
1 10 20 5 1 2 ....
2 3 4 NaN 10 1 ....
我需要将列0,1,2,3,4...
的单元格值转置到列标题,如果各个ID的单元格值存在,则用1填充ID。
所需的输出:
ID 1 2 3 4 5 ... 10 20 ..
1 1 1 0 0 1 ... 1 1 ..
2 1 0 1 1 0 ... 1 0 ..
请注意,某些条目可以是NaN
。
如何获得所需的输出?
答案 0 :(得分:3)
将DataFrame.set_index
与DataFrame.stack
一起使用以删除缺失值,然后按get_dummies
创建指标,并按一级返回1/0
的{{1}},最后将列转换为整数:
max
编辑:
df1 = (pd.get_dummies(df.set_index('ID').stack())
.max(level=0)
.rename(columns=int)
.reset_index())
print (df1)
ID 1 2 3 4 5 10 20
0 1 1 1 0 0 1 1 1
1 2 1 0 1 1 0 1 0
如果使用print (df)
ID 0 1 2 3 4 5
0 1 10 20 5.0 1 2 5
1 2 3 4 NaN 10 1 2
,则输出中始终为max
值(选中5列):
0/1
但是如果使用df1 = (pd.get_dummies(df.set_index('ID').stack())
.max(level=0)
.rename(columns=int)
.reset_index())
print (df1)
ID 1 2 3 4 5 10 20
0 1 1 1 0 0 1 1 1
1 2 1 1 1 1 0 1 0
,它会计算值(检查5列):
sum
答案 1 :(得分:1)
使用melt
和pd.crosstab
的另一种方式
df1 = df.melt('ID')
df_final = pd.crosstab(index=df1.ID, columns=df1.value).reset_index()
Out[673]:
value ID 1.0 2.0 3.0 4.0 5.0 10.0 20.0
0 1 1 1 0 0 1 1 1
1 2 1 0 1 1 0 1 0
注意:pd.crosstab
的默认计数使用频率。因此,重复值将计为它们的频率。如果只希望使用1/0
指示符,只需按以下方式链接ge(1)
和astype
pd.crosstab(index=df1.ID, columns=df1.value).ge(1).astype(int).reset_index()