我想将pandas df转换为One_hot pandas df。 最好的描述方式可能是举个例子:
我拥有的df看起来像这样:
ID|DEV |STATE|
1 |DEV1|on
2 |DEV2|on
3 |DEV1|off
3 |DEV3|on
3 |DEV3|off
我知道非唯一ID不好,我正在努力。
然后我旋转桌子:
data.pivot_table(index='ID', columns=['DEV'], values='STATE', dropna=True, aggfunc='first')
结果如下
ID|DEV1|DEV2|DEV3
1 |on | NaN| NaN
2 | NaN| on | NaN
3 | off| NaN| on
4 | NaN| NaN| off
我现在想得到这样的东西:
ID|DEV1.on|DEV1.off|DEV2.on|DEV3.on|DEV3.off
1 | 1 | 0| 0| 0| 0
2 | 0 | 0| 1| 0| 0
3 | 0 | 1| 0| 1| 0
4 | 0 | 0| 0| 0| 1
我知道如何连接列名,但不知道如何获得“ one-hot”样式。也许可以使用aggfunc吗?
你能帮我吗?
Fabian
答案 0 :(得分:6)
将get_dummies
与带有分隔符.
的连接列一起使用,按ID
进行索引,按set_index
进行索引,最后按索引获得max
:
df['join'] = df['DEV'] + '.' + df['STATE']
df = pd.get_dummies(df.set_index('ID')['join']).max(level=0)
print (df)
DEV1.off DEV1.on DEV2.on DEV3.off DEV3.on
ID
1 0 1 0 0 0
2 0 0 1 0 0
3 1 0 0 1 1
使用MultiIndex
并用unstack
进行整形的另一种解决方案-但随后必须使用swaplevel
,sort_index
并最后展平MultiIndex
:
df = (pd.get_dummies(df.set_index(['ID','DEV'])['STATE'])
.max(level=[0,1])
.unstack(fill_value=0)
.swaplevel(0,1, axis=1)
.sort_index(axis=1))
df.columns = df.columns.map('.'.join)
print (df)
DEV1.off DEV1.on DEV2.off DEV2.on DEV3.off DEV3.on
ID
1 0 1 0 0 0 0
2 0 0 0 1 0 0
3 1 0 0 0 1 1
答案 1 :(得分:1)
另一个选择:
df['new_col'] = df['DEV'] + '.' + df['STATE']
df1 = pd.get_dummies(df['new_col'])
df = pd.concat([df, df1], axis=1).drop(['DEV', 'STATE','new_col'], axis=1)
df = df.groupby("ID").sum().replace(0, np.nan)
输出:
DEV1.off DEV1.on DEV2.on DEV3.off DEV3.on
ID
1 NaN 1.0 NaN NaN NaN
2 NaN NaN 1.0 NaN NaN
3 1.0 NaN NaN 1.0 1.0