查找熊猫数据框中首次出现的特定部分字符串的索引位置

时间:2018-07-03 14:30:16

标签: python pandas dataframe

我正在使用AFRINIC Whois数据。我正在尝试查找第一次出现的子字符串的位置。在示例中(熊猫数据框的左侧有一列“数据”是索引),我试图找到子字符串“ inetnum”。因此,我正在寻找的结果是“ 2750383”。

    data
20  mnt-lower: info
21  changed: info
22  changed: info
23  changed: info
24  changed: info
25  source: info
26  as-block: info
27  type: info
28  descr: info
29  remarks: info
... ...
2750381 changed: info
2750382 source: info
2750383 inetnum: info
2750384 netname: info
2750385 descr: info
2750386 country: info
2750387 admin-c: info
2750388 tech-c: info
2750389 status: info

我尝试过:

afrinic.data.ne('inetnum').idxmax()

但是这给了我“ []”,因为它正在寻找第一个完整的字符串并产生0个结果。

我也尝试过:

indices = [i for i, s in enumerate(afrinic.data) if 'inetnum' in s]

但是,当我正在寻找的只是第一个实例索引号时,这会给我单词“ inetnum”的每个索引号。我可以列出该列表,而仅使用头号,但是必须有一种更好的方法来做到这一点。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

使用str.contains进行任何位置的检查:

out = afrinic.data.str.contains('inetnum').idxmax()
print (out)
2750383

或使用str.startswith测试每个字符串的开头:

out = afrinic.data.str.startswith('inetnum').idxmax()

编辑:

如果没有匹配的值,更通用的解决方案:

m = afrinic.data.str.contains('inetnum')
out = m.idxmax() if m.any() else 'no match'

答案 1 :(得分:1)

您非常亲密。将next与生成器表达式一起使用:

first_index = next((i for i, s in enumerate(afrinic.data) if 'inetnum' in s), None)

如果未找到有效索引,则next将根据后备参数返回None

next与手动迭代结合使用,对于大型数据帧而言,基于Pandas / NumPy的方法将效率更高,在大型数据帧中,您期望在系列开始时有匹配项。否则,您可以按照@jezrael的解决方案使用pd.Series.str方法。