Python 使用字典在Dataframe中创建布尔列
我正在使用网络跟踪数据集,并已将初始数据加载到pandas数据框中,如下所示: 我创建了一个python dict,其中包含常见的端口号和应用程序名称,如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 我该怎
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编写一个函数。将此函数应用于列的切片。结束。这样我也可以处理端口号的标称值吗?这样我也可以处理端口号的标称值吗?这样我也可以处理端口号的标称值吗?这样我也可以处理端口号的标称值吗??