首页 > 解决方案 > python - 如何根据一列的计算创建新列。UserAccountControl 标志的计算

问题描述

我有以下示例数据框:

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)

提前非常感谢!

标签: pythonpandas

解决方案


你不能使用你创建的函数来做你想做的事。例如,每次您这样做时,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 的逻辑,但如果您更正它并重复我在上面为您需要的所有列写的内容,您应该能够获得您正在寻找的结果。


推荐阅读