【问题标题】:Create Boolean Columns in Pandas Dataframe using Dictionary使用 Dictionary 在 Pandas Dataframe 中创建布尔列
【发布时间】:2015-07-25 18:41:13
【问题描述】:

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

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

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

我想通过添加额外的列来修改我的数据框,这些列的名称将是 ports_dict 的唯一值,如果 sportdport 中的任何一个包含相关键,则新添加的列应该有一个值True, False 否则,像这样:

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

我将如何实现这一目标?

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

试试这个。 Series.map 应该是从字典中查找值的更快方法。 pandas.get_dummies 将单列数据转换为每个不同值的列,分别为 1s / 0s,我将其转换为布尔值,并与 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

【讨论】:

  • 那么这样我也可以处理端口号的标称值吗??
【解决方案2】:

如果我建议您只拥有一个service 列,那么如果sportdportport_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

【讨论】:

  • 感谢您的建议,它可以工作,但是由于循环,并且由于我的数据集包含大约 47121615 行,因此需要花费大量时间。你能建议我优化它的方法吗?
  • for 循环中尝试这种方式。它将创建 2 个新列,sservicedservicedf[['dservice', 'sservice']] = df[['dport','sport']].applymap(port_dict.get)
猜你喜欢
  • 2015-05-30
  • 2018-11-25
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 2020-10-28
  • 2018-08-21
  • 1970-01-01
相关资源
最近更新 更多