用实数值创建虚拟列

时间:2018-08-14 11:25:27

标签: python pandas dataframe dummy-data

我有一个DF,如下所示:

DF =
id  Result      
1   Li_In-AR-B
1   Li_In-AR-L
3   N
4   Lo_In-AR-U
5   Li_In-AR-U
6   Or_Ba-AR-B
6   Or_Ba-AR-L
7   N

现在,我想为第一个“-”之前的Result中的每个唯一值创建新列。新列中的所有其他值都应设置为N

DF =
id  Result        Li_In         Lo_In       Or_Ba
1   Li_In-AR-B    Li_In-AR-B    N           N
1   Li_In-AR-L    Li_In-AR-L    N           N      
3   N             N             N           N
4   Lo_In-AR-U    N             Lo_In-AR-U  N
5   Li_In-AR-U    Li_In-AR-U    N           N
6   Or_Ba-AR-B    N             N           Or_Ba-AR-B
6   Or_Ba-AR-L    N             N           Or_Ba-AR-L
7   N             N             N           N

我认为我可以使用.get_dummies轻松地做到这一点,但这只会在每个单元格中返回一个二进制值。

DF_dummy = DF.Result.str.get_dummies(sep='-')
DF = pd.concat([DF,DF_dummy ],axis=1)

任何想法

1 个答案:

答案 0 :(得分:2)

通过split创建布尔值DataFrame,删除列N并通过1进行比较。然后通过DataFrame.where创建具有相同列(如mask和repalce值)的DataFrame

m = DF['Result'].str.split('-', n=1).str[0].str.get_dummies().drop('N', axis=1) == 1
df1 = pd.concat([DF['Result']] * len(m.columns), axis=1, keys=m.columns)

df = DF.join(df1.where(m.values, 'N'))
print (df)
   id      Result       Li_In       Lo_In       Or_Ba
0   1  Li_In-AR-B  Li_In-AR-B           N           N
1   1  Li_In-AR-L  Li_In-AR-L           N           N
2   3           N           N           N           N
3   4  Lo_In-AR-U           N  Lo_In-AR-U           N
4   5  Li_In-AR-U  Li_In-AR-U           N           N
5   6  Or_Ba-AR-B           N           N  Or_Ba-AR-B
6   6  Or_Ba-AR-L           N           N  Or_Ba-AR-L
7   7           N           N           N           N