python - 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)
提前非常感谢!
解决方案
你不能使用你创建的函数来做你想做的事。例如,每次您这样做时,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 的逻辑,但如果您更正它并重复我在上面为您需要的所有列写的内容,您应该能够获得您正在寻找的结果。
推荐阅读
- python - 将 pandas 列 datetime64 的时区从 UTC 转换为 America/New_York
- java - 反序列化对象时,Apache Camel 抛出异常:com.fasterxml.jackson.core.JsonParseException: Unrecognized token
- python - 如何在不使用回调函数的情况下用输入框定义全局变量?
- windows - 如何对文件夹中的所有子目录执行 git pull?(在 Windows 中)
- c - 函数定义中函数声明的目的
- java - 使用 CommandLineRunner 安装 Maven
- java - Web3j 是否需要使用端口转发?
- c# - 如何返回主菜单并将列表分列?
- r - 根据恒定增长因子计算每月人口估计值
- python - 动态编程背包