簡體   English   中英

python-如何基於一列的計算來創建新列。 UserAccountControl標志的計算

[英]python - How to create a new columns based on calculations of one column. Calculation of UserAccountControl flags

我有以下示例數據框:

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

第三列包含useraccountcontrolflag ,每一行代表一個用戶條目。 標志是累積的。 這意味着-禁用的用戶帳戶,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)

在此先多謝!

不知道為什么列名不同於您引用的Microsoft文檔。 但是假設您可以根據該文檔重命名該列,則可以使用numpy bitwise_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所使用的邏輯,但是如果您對此進行更正並針對所有列重復上述操作,您應該可以得到想要的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM