Python 使用字典在Dataframe中创建布尔列

Python 使用字典在Dataframe中创建布尔列,python,pandas,dataframe,Python,Pandas,Dataframe,我正在使用网络跟踪数据集,并已将初始数据加载到pandas数据框中,如下所示: 我创建了一个python dict,其中包含常见的端口号和应用程序名称,如 port_dict = {80: 'http', 20: 'ftp', 21: 'ftp'} 我想通过添加额外的列来修改我的数据框,这些列的名称将是端口的唯一值,如果sport或dport中的任何一个包含相关键,则新添加的列应具有值True,False,否则,如下所示: 在上图中,https列应该有True,因为这项运动是443 我该怎

我正在使用网络跟踪数据集,并已将初始数据加载到pandas数据框中,如下所示:

我创建了一个python dict,其中包含常见的端口号和应用程序名称,如

port_dict = {80: 'http', 20: 'ftp', 21: 'ftp'}
我想通过添加额外的列来修改我的数据框,这些列的名称将是
端口的唯一值,如果
sport
dport
中的任何一个包含相关键,则新添加的列应具有值
True
False
,否则,如下所示:

在上图中,
https
列应该有
True
,因为这项运动是
443


我该怎么做呢?

如果我可以建议您只需要一个
服务
列,那么如果
运动
端口
端口dict
键中,那么值将写入
服务
列:

port_dict = {80: 'http', 20: 'ftp', 21: 'ftp'}

df = pd.DataFrame(data={'sport':[1, 2, 80, 20], 'dport':[1, 80, 2, 3]})

for i in df.index:
    found_service = port_dict.get(df.ix[i, 'sport'], False) or port_dict.get(df.ix[i, 'dport'], False)
    df.at[i, 'service'] = found_service

# a small example dataframe
>>       dport  sport service
      0      1      1    False
      1     80      2    http
      2      2     80    http
      3      3     20     ftp

如果我建议您只需要一个
service
列,那么如果
sport
dport
port\u dict
键中,则值将写入
service
列:

port_dict = {80: 'http', 20: 'ftp', 21: 'ftp'}

df = pd.DataFrame(data={'sport':[1, 2, 80, 20], 'dport':[1, 80, 2, 3]})

for i in df.index:
    found_service = port_dict.get(df.ix[i, 'sport'], False) or port_dict.get(df.ix[i, 'dport'], False)
    df.at[i, 'service'] = found_service

# a small example dataframe
>>       dport  sport service
      0      1      1    False
      1     80      2    http
      2      2     80    http
      3      3     20     ftp

如果我建议您只需要一个
service
列,那么如果
sport
dport
port\u dict
键中,则值将写入
service
列:

port_dict = {80: 'http', 20: 'ftp', 21: 'ftp'}

df = pd.DataFrame(data={'sport':[1, 2, 80, 20], 'dport':[1, 80, 2, 3]})

for i in df.index:
    found_service = port_dict.get(df.ix[i, 'sport'], False) or port_dict.get(df.ix[i, 'dport'], False)
    df.at[i, 'service'] = found_service

# a small example dataframe
>>       dport  sport service
      0      1      1    False
      1     80      2    http
      2      2     80    http
      3      3     20     ftp

如果我建议您只需要一个
service
列,那么如果
sport
dport
port\u dict
键中,则值将写入
service
列:

port_dict = {80: 'http', 20: 'ftp', 21: 'ftp'}

df = pd.DataFrame(data={'sport':[1, 2, 80, 20], 'dport':[1, 80, 2, 3]})

for i in df.index:
    found_service = port_dict.get(df.ix[i, 'sport'], False) or port_dict.get(df.ix[i, 'dport'], False)
    df.at[i, 'service'] = found_service

# a small example dataframe
>>       dport  sport service
      0      1      1    False
      1     80      2    http
      2      2     80    http
      3      3     20     ftp

试试这个
Series.map应该是从字典中查找值的更快的方法
pandas.get|dummies
将一列数据转换为列,每个不同的值为1s/0s,我正在将其转换为bool,并与or(
)进行比较,以确定服务是否在任一端口上

service = pd.get_dummies(df['sport'].map(port_dict)).astype(bool) | pd.get_dummies(df['sport'].map(port_dict)).astype(bool)

df[services.columns] = services

In [166]: df.head()
Out[166]: 
   dport  sport    ftp   http
0      1      1  False  False
1     80      2  False  False
2      2     80  False   True
3      3     20   True  False
4      1      1  False  False

试试这个
Series.map应该是从字典中查找值的更快的方法
pandas.get|dummies
将一列数据转换为列,每个不同的值为1s/0s,我正在将其转换为bool,并与or(
)进行比较,以确定服务是否在任一端口上

service = pd.get_dummies(df['sport'].map(port_dict)).astype(bool) | pd.get_dummies(df['sport'].map(port_dict)).astype(bool)

df[services.columns] = services

In [166]: df.head()
Out[166]: 
   dport  sport    ftp   http
0      1      1  False  False
1     80      2  False  False
2      2     80  False   True
3      3     20   True  False
4      1      1  False  False

试试这个
Series.map应该是从字典中查找值的更快的方法
pandas.get|dummies
将一列数据转换为列,每个不同的值为1s/0s,我正在将其转换为bool,并与or(
)进行比较,以确定服务是否在任一端口上

service = pd.get_dummies(df['sport'].map(port_dict)).astype(bool) | pd.get_dummies(df['sport'].map(port_dict)).astype(bool)

df[services.columns] = services

In [166]: df.head()
Out[166]: 
   dport  sport    ftp   http
0      1      1  False  False
1     80      2  False  False
2      2     80  False   True
3      3     20   True  False
4      1      1  False  False

试试这个
Series.map应该是从字典中查找值的更快的方法
pandas.get|dummies
将一列数据转换为列,每个不同的值为1s/0s,我正在将其转换为bool,并与or(
)进行比较,以确定服务是否在任一端口上

service = pd.get_dummies(df['sport'].map(port_dict)).astype(bool) | pd.get_dummies(df['sport'].map(port_dict)).astype(bool)

df[services.columns] = services

In [166]: df.head()
Out[166]: 
   dport  sport    ftp   http
0      1      1  False  False
1     80      2  False  False
2      2     80  False   True
3      3     20   True  False
4      1      1  False  False

感谢您的建议,它是有效的,但由于循环,并且由于我的数据集包含大约47121615行,因此需要花费大量的时间。你能给我建议一些优化的方法吗?试着用这种方法来代替
for
循环。它将创建两个新列,
sservice
dservice
df[['dservice',sservice']=df['dport','sport']]].applymap(port_dict.get)
感谢您的建议,它是有效的,但由于循环,而且由于我的数据集包含大约47121615行,它需要花费大量时间。你能给我建议一些优化的方法吗?试着用这种方法来代替
for
循环。它将创建两个新列,
sservice
dservice
df[['dservice',sservice']=df['dport','sport']]].applymap(port_dict.get)
感谢您的建议,它是有效的,但由于循环,而且由于我的数据集包含大约47121615行,它需要花费大量时间。你能给我建议一些优化的方法吗?试着用这种方法来代替
for
循环。它将创建两个新列,
sservice
dservice
df[['dservice',sservice']=df['dport','sport']]].applymap(port_dict.get)
感谢您的建议,它是有效的,但由于循环,而且由于我的数据集包含大约47121615行,它需要花费大量时间。你能给我建议一些优化的方法吗?试着用这种方法来代替
for
循环。它将创建两个新列,
sservice
dservice
df[['dservice','sservice']=df['dport','sport']].applymap(port_dict.get)
看起来是一个很好的多列应用的用例。只需使用映射dict编写一个函数。将此函数应用于列的切片。结束。看起来是多列应用的一个很好的用例。只需使用映射dict编写一个函数。将此函数应用于列的切片。结束。看起来是多列应用的一个很好的用例。只需使用映射dict编写一个函数。将此函数应用于列的切片。结束。看起来是多列应用的一个很好的用例。只需使用映射dict编写一个函数。将此函数应用于列的切片。结束。这样我也可以处理端口号的标称值吗?这样我也可以处理端口号的标称值吗?这样我也可以处理端口号的标称值吗?这样我也可以处理端口号的标称值吗??