[英]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.