首页 > 解决方案 > 在 Pandas DF 中取消虚拟变量的最有效方法

问题描述

所以在下面的截图中,我们有 3 个不同的能量站点,ID01、ID18 和 ID31。它们采用虚拟变量类型的格式,出于可视化目的,我只想创建一个名为“站点”的列,我可以使用它。你会看到我快速创建的循环,但它似乎非常低效。关于如何以最快的方式实现这一目标的任何指示?

截屏

标签: pythonpandasdataframe

解决方案


设置

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

推荐阅读