<p>这是值得考虑的。我无法用更大的测试数据得到更奇特的索引答案,但Barmar的循环应该是可靠的:</p>
<blockquote>
<p>Just loop over the dataframe indexes. If the current df element is in the list, remove it from the list. When the list becomes empty, the current index is the answer.</p>
</blockquote>
<pre><code>def idxall(series, elements):
for i, e in enumerate(series.to_numpy()): # faster than series.items()
if e in elements:
elements.remove(e)
if not elements:
return i + 1
return np.nan
</code></pre>
<hr/>
<h3>计时</h3>
<p>给定<code>df = pd.DataFrame({'mycol': np.random.choice(list(string.ascii_lowercase), size=1000)})</code>:</p>
<pre><code>%timeit tdy_idxall(df.mycol, list(string.ascii_lowercase))
# 21.4 µs ± 7.44 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
</code></pre>
<pre><code>%timeit henry_ecker_np_unique(df.mycol, list(string.ascii_lowercase))
# 379 µs ± 48.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</code></pre>
<pre><code>%timeit u12_forward_idxmax(df.mycol, list(string.ascii_lowercase)
# 538 µs ± 61.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</code></pre>
<pre><code>%timeit corralien_idxall(df.mycol, list(string.ascii_lowercase))
# 1.28 ms ± 243 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</code></pre>
<hr/>
<h3>验证</h3>
<ul>
<li><p>使用OP的样本:</p>
<pre><code>df = pd.DataFrame({'mycol': list('axyebcolsdg')})
elements = list('abcd')
idxall(df.mycol, elements)
# 10
</code></pre>
</li>
<li><p>使用Henry的样本#1(混合顺序和重复):</p>
<pre><code>df = pd.DataFrame({'mycol': list('dxcabcodsdg')})
elements = list('abcd')
idxall(df.mycol, elements)
# 5
</code></pre>
</li>
<li><p>使用Henry的样本#2(未找到所有元素):</p>
<pre><code>df = pd.DataFrame({'mycol': list('dxcabcodsdg')})
elements = list('abcz')
idxall(df.mycol, elements)
# nan
</code></pre>
</li>
</ul>