Pandas DF中非虚拟变量的最有效方法

时间:2018-05-14 14:03:00

标签: python pandas dataframe

因此,在下面的屏幕截图中,我们有3个不同的能量站点,ID01,ID18和ID31。它们是虚拟变量类型的格式,出于可视化目的,我想创建一个名为“Sites”的列,我可以使用它。你会看到我很快就做到了这个循环,但它似乎超级低效。有关如何以最快的方式实现这一目标的任何指示?

Screenshot

1 个答案:

答案 0 :(得分:4)

设置

data = pd.DataFrame([
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1],
    [1, 0, 0],
    [0, 1, 0]
], columns=['ID01', 'ID18', 'ID31']).assign(A=1, B=2)

data

   ID01  ID18  ID31  A  B
0     1     0     0  1  2
1     0     1     0  1  2
2     0     0     1  1  2
3     1     0     0  1  2
4     0     1     0  1  2
带有字符串和对象的

dot产品。

如果这些是真正的虚拟值01

,则此方法有效
def undummy(d):
    return d.dot(d.columns)

data.assign(Site=data.filter(regex='^ID').pipe(undummy))

   ID01  ID18  ID31  A  B  Site
0     1     0     0  1  2  ID01
1     0     1     0  1  2  ID18
2     0     0     1  1  2  ID31
3     1     0     0  1  2  ID01
4     0     1     0  1  2  ID18

argmax切片

这可行,但如果数据不符合问题,则会产生意外结果。

def undummy(d):
    return d.columns[d.values.argmax(1)]

data.assign(Site=data.filter(regex='^ID').pipe(undummy))

   ID01  ID18  ID31  A  B  Site
0     1     0     0  1  2  ID01
1     0     1     0  1  2  ID18
2     0     0     1  1  2  ID31
3     1     0     0  1  2  ID01
4     0     1     0  1  2  ID18