问题描述
我有四个数据框如下:
Proxyid | A | B | C | D |
---|---|---|---|---|
123 | 1 | 0 | 0 | 0 |
456 | 1 | 1 | 1 | 1 |
789 | 0 | 0 | 0 | 0 |
这是数据框的想法。现在我想复制有多个 1. 的行,并按如下方式分配值。
Proxyid | A | B | C | D |
---|---|---|---|---|
123 | 1 | 0 | 0 | 0 |
456 | 1 | 0 | 0 | 0 |
456 | 0 | 1 | 0 | 0 |
456 | 0 | 0 | 1 | 0 |
456 | 0 | 0 | 0 | 1 |
789 | 0 | 0 | 0 | 0 |
我真的很感激任何输入。谢谢。
解决方法
通过 pd.get_dumies
的一个选项:
df1 = (
pd.get_dummies(
df.set_index('Proxyid')
.mul(df.columns[1:])
.replace('',np.NAN)
.stack()
)
.reset_index().drop('level_1',1)
)
result = df1.append(df[~df.Proxyid.isin(df1.Proxyid)])
输出:
代理id | A | B | C | D | |
---|---|---|---|---|---|
0 | 123 | 1 | 0 | 0 | 0 |
1 | 456 | 1 | 0 | 0 | 0 |
2 | 456 | 0 | 1 | 0 | 0 |
3 | 456 | 0 | 0 | 1 | 0 |
4 | 456 | 0 | 0 | 0 | 1 |
2 | 789 | 0 | 0 | 0 | 0 |
如果您有额外的列,只需将它们添加到 set_index
中并使用:
df1 = df.set_index(['Proxyid','test'])
df1 = pd.get_dummies(df1.mul(df1.columns).replace('',np.NAN).stack()).reset_index()
result = df1.append(df[~df.Proxyid.isin(df1.Proxyid)])