python如何基于一列的计算创建新列。UserAccountControl标志的计算

2024-10-01 04:45:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下示例数据框:

column1,column2,column3
tom,0100,544
tim,0101,514
ben,0899,1512

第三列包含useraccountcontrolflag,每行表示一个用户条目。标志是累积的。 这意味着-disabled用户帐户,UserAccountControl设置为514(2+512)。在我的例子中,tim被禁用了。你知道吗

我想为每个标志创建一个新列,如果标志被设置,它将在其中赋值1,否则赋值0。你知道吗

对于上面的示例,输出如下所示:

column1  column2  column3  DISABELDACCOUNT  NORMALUSER  PASSWORDNOTREQ  TEMP_DUPLICATE_ACCOUNT  SPECIALUSER
tom      100      544                0           1               1                      0            0
tim      100      512                0           1               0                       0            0
ben      899     1512                0           1               0                       0            1

这是我的python代码-但它不适用于我的数据帧。它只适用于一行。。。你知道吗

#!/bin/python
import pandas as pd
from pandas import DataFrame
import numpy as np

def get_flags(number):
      df['DISABELDACCOUNT']=0
      df['NORMALUSER']=0
      df['PASSWORDNOTREQ']=0
      df['TEMP_DUPLICATE_ACCOUNT']=0
      df['SPECIALUSER']=0
      while number > 0:
             if number >= 1000:
                     df['SPECIALUSER']=1
                     number = number - 1000
                     continue
             elif number >= 512:
                     df['NORMALUSER']=1
                     number = number - 512
                     continue
             elif number >= 256:
                     df['TEMP_DUPLICATE_ACCOUNT']=1
                     number = number - 256
                     continue
             elif number >=32:
                     df['PASSWORDNOTREQ']=1
                     number = number - 32
                     continue
             elif number >=2:
                     df['TEMP_DUPLICATE_ACCOUNT']=1
                     number = number - 2
                     continue
df = pd.read_csv('data2.csv')
df['column3'].apply(get_flags)

提前多谢了!你知道吗


Tags: import示例numberdf标志accounttemptim
2条回答

不知道为什么列名与您引用的Microsoft文档不同。但是假设您可以根据文档重命名列,那么可以使用numpybitwise_and

df = pd.read_csv('data2.csv')
flags = {
    'SCRIPT'           : 0x0001,
    'ACCOUNTDISABLE'   : 0x0002,
    'HOMEDIR_REQUIRED' : 0x0008,
    'LOCKOUT'          : 0x0010,
    'PASSWD_NOTREQD'   : 0x0020,
    #.... (add more flags here as required, I just copy-pasted from the docs)
}   

for (f, mask) in flags.items():            
    df[f] = np.bitwise_and(df['column3'], mask) / mask
print(df)

这将输出:

  column1  column2  column3  SCRIPT  ACCOUNTDISABLE  HOMEDIR_REQUIRED  LOCKOUT  PASSWD_NOTREQD
0     tom      100      544     0.0             0.0               0.0      0.0             1.0
1     tim      101      514     0.0             1.0               0.0      0.0             0.0
2     ben      899     1512     0.0             0.0               1.0      0.0             1.0

顺便说一下,使用位掩码检查作为十六进制数串在一起的标志是一种非常常见的模式。你知道吗

你不能用你创建的函数来做你想做的事。例如,每次执行df['SPECIALUSER']=1操作时,它都会将1赋给整列,而不仅仅赋给您认为目标行。 要将每个值赋给正确的行,必须将值分别赋给每个列:

df['SPECIALUSER'] = np.where(df['column3'] >= 1000, 1, 0)
df['NORMALUSER'] = np.where((df['column3'] - 1000) >= 512, 1, 0)
...

我不完全理解你用来分配1和0的逻辑,但是如果你纠正了这个错误,并且对所有你需要的列重复我上面写的内容,你应该能够得到你想要的结果。你知道吗

相关问题 更多 >