我正在使用网络跟踪数据集,并已将初始数据加载到pandas数据框中,如下所示:
我创建了一个python dict,其中包含常见的端口号和应用程序名称,如
port_dict = {80: 'http', 20: 'ftp', 21: 'ftp'}
我希望通过添加其名称将是ports_dict
的唯一值的其他列来修改我的数据框,如果sport
或dport
中的任何一个包含相关的键,则新的添加的列应该具有值True
,False
否则,如下所示:
在上图中,https
列应该True
,因为这项运动是443
。
我将如何完成这项工作?
答案 0 :(得分:2)
试一试。 Series.map
应该是从字典中查找值的更快捷方式。 pandas.get_dummies
将单个数据列转换为每个不同值的列为1s / 0s,我将其转换为bool,并与或(|
)进行比较以获取服务是否为在任何一个港口。
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
答案 1 :(得分:1)
如果我建议你只有一个service
列,那么如果sport
或dport
位于port_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