Python 在DF中取消虚拟变量的最有效方法

Python 在DF中取消虚拟变量的最有效方法,python,pandas,dataframe,Python,Pandas,Dataframe,在下面的截图中,我们有3个不同的能源站点,ID01、ID18和ID31。它们是一种虚拟变量类型的格式,出于可视化目的,我只想创建一个名为“Sites”的列,我可以使用它。你会看到我很快就做了一个循环,但它似乎效率非常低。关于如何以最快的方式实现这一点,有什么建议吗 设置 dot带字符串和对象的产品。 如果这些是真正的虚拟值0或1 def undummy(d): return d.dot(d.columns) data.assign(Site=data.filter(regex='^I

在下面的截图中,我们有3个不同的能源站点,ID01、ID18和ID31。它们是一种虚拟变量类型的格式,出于可视化目的,我只想创建一个名为“Sites”的列,我可以使用它。你会看到我很快就做了一个循环,但它似乎效率非常低。关于如何以最快的方式实现这一点,有什么建议吗

设置
dot
带字符串和对象的产品。 如果这些是真正的虚拟值
0
1

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
安装程序
dot
带字符串和对象的产品。 如果这些是真正的虚拟值
0
1

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

如果你想最大限度地获得答案,最好是共享基于文本的数据集。。。我们无法在不重新创建图像的情况下处理图像中的数据,这太麻烦了。idxmax成功了,谢谢。如果您想最大限度地获得答案,最好共享基于文本的数据集。。。我们无法在不重新创建图像的情况下处理图像中的数据,这太麻烦了。idxmax工作正常,谢谢。感谢您花时间作出如此彻底的响应!不客气!很高兴为您提供帮助。@justinzin如果答案有帮助,请确保对其进行投票。如果答案解决了您的问题,请将其标记为已接受,以便我们可以将线程标记为已解决。在大数据帧上,使用该选项比使用
(我用100000行数据帧对两种方法进行计时,
dot
平均耗时约0.016秒,
np。其中
平均耗时约0.00681秒)感谢您花时间做出如此彻底的响应!欢迎您!很高兴能提供帮助。@Justinzin如果答案有帮助,请不要确保对其进行投票,如果它解决了您的问题,请将其标记为已接受,以便我们可以将线程标记为已解决。在大数据帧上,它的使用速度比
dot
(我用100000行数据帧对两种方法进行计时,
dot
平均耗时约0.016秒,
np。其中
平均耗时约0.00681秒)