将单元格值转换为列标题,如果在python中匹配则将其填充为1

时间:2019-09-20 11:24:25

标签: python pandas

我有一个数据框:

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

如何获得所需的输出?

2 个答案:

答案 0 :(得分:3)

DataFrame.set_indexDataFrame.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)

使用meltpd.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()