使用Dictionary在Pandas Dataframe中创建布尔列

时间:2015-07-25 18:41:14

标签: python pandas dataframe

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

Initial Dataframe

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

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

我希望通过添加其名称将是ports_dict的唯一值的其他列来修改我的数据框,如果sportdport中的任何一个包含相关的键,则新的添加的列应该具有值TrueFalse否则,如下所示:

Modified Dataframe

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

我将如何完成这项工作?

2 个答案:

答案 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列,那么如果sportdport位于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