我正在使用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”的每个索引号。我可以列出该列表,而仅使用头号,但是必须有一种更好的方法来做到这一点。任何帮助将不胜感激。
答案 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
方法。