<p>您可能没有正确使用函数的<code>cat</code>参数。我希望apply被调用多次(每行一次),因此<code>cat</code>参数已经包含要检查的值(或具有该值的单个元素数组)。通过在df上使用for,实际上是基于整个数据帧的第一行的结果,并对所有函数调用使用相同的值进行响应</p>
<p>在函数中,您的代码类似于switch语句(Python没有这个语句,但是可以很容易地进行模拟)</p>
<p>为了模拟普通的switch语句,我通常定义一个助手函数,如下所示:</p>
<pre><code>def switch(v): yield lambda *c:v in c
</code></pre>
<p>在in语句的一次传递中使用:</p>
<pre><code>x = 3
for case in switch(x):
if case(1): return "one"
if case(2,4): return "even"
if case(3): return "three"
</code></pre>
<p>在本例中,比较条件稍有不同,使用正则表达式而不是cat中的“s”会有好处。因此,让我们定义一个wordSwitch()辅助函数来查找整个单词模式:</p>
<pre><code>import re
def wordSwitch(v): yield lambda *c: any(re.search(r'\b('+w+')\b',v) for w in c)
</code></pre>
<p>然后,您的代码可能如下所示:</p>
<pre><code>def catGroup(cat):
for case in wordSwitch(cat): # could need to be cat[0]
if case(*sleeping): return "sleeping"
if case(*eating): return "eating"
if case(*sightseeing): return "sightseeing"
return "other"
</code></pre>
<p><em>注意,尽管我不熟悉<code>.apply()</code>,但我相信它直接接收字段(或行)值,因此您不需要(也可能不必)从df['..']获取数据。您应该尝试打印函数接收到的<code>cat</code>值以确保正确</em></p>
<p>您还可以将单词列表直接放在case()部分:</p>
<pre><code>for case in wordSwitch(cat):
if case('bed','hostel','hotel'): return "sleeping"
if case('bar','bistro','cafe','pub','restaurant'): return "eating"
if case('museum','theater','zoo'): return "sightseeing"
return "other"
</code></pre>