Python 如何检查行值并使用它们更新已存在的列

Python 如何检查行值并使用它们更新已存在的列,python,pandas,Python,Pandas,我想更新一列(名称),如下所示: 如果Names中单词的最后一个字符以a结尾,并且不是pizza,则分配c 如果Names中单词的最后一个字符以o或i结尾,或者是pizza,则分配m 要检查的列是 Names choriocarcinoma medulloblastoma phenylketonuria counterguerilla lymphogranuloma archipelago braggadocio chiaroscuro decrescendo violoncello ac

我想更新一列(
名称
),如下所示:

  • 如果
    Names
    中单词的最后一个字符以
    a
    结尾,并且不是
    pizza
    ,则分配
    c
  • 如果
    Names
    中单词的最后一个字符以
    o
    i
    结尾,或者是
    pizza
    ,则分配
    m
要检查的列是

Names

choriocarcinoma
medulloblastoma
phenylketonuria
counterguerilla
lymphogranuloma
archipelago
braggadocio
chiaroscuro
decrescendo
violoncello
accelerando
afficionado
tachyarrhythmia
teratocarcinoma
caudillismo
cinquecento
countermemo
oligodendroglia
pleuropneumonia
pizza
要提取我所做的最后一个字符:

df['Names'] = [x.strip()[-1] for x in df['Names']]
要检查并分配新值,我执行了以下操作:

if df['Names'] == 'a': 
   df['Names'] = 'c'
elif df['Names'] in ('o','i','pizza'):
   df['Names'] = 'm'
else: 
   df['Names'] = 'Other'
但它不起作用。也

def applyFunc(s):
    if s == 'a' and s != 'pizza':
        return 'c'
    elif s in ('o','i', 'pizza'):
        return 'm'
    return 'other'
不起作用

你能告诉我错误在哪里吗?

IIUC,以及

输出

              Names new
0   choriocarcinoma   c
1   medulloblastoma   c
2   phenylketonuria   c
3   counterguerilla   c
4   lymphogranuloma   c
5       archipelago   m
6       braggadocio   m
7       chiaroscuro   m
8       decrescendo   m
9       violoncello   m
10      accelerando   m
11      afficionado   m
12  tachyarrhythmia   c
13  teratocarcinoma   c
14      caudillismo   m
15      cinquecento   m
16      countermemo   m
17  oligodendroglia   c
18  pleuropneumonia   c
19            pizza   m

通过组合
str.endswith()
|
进行布尔选择,以进行备选选择。使用嵌套的
np.where
。谨慎<代码>np。选择始终是更好的选项

import numpy as np
a= (df.Names.str.endswith('a'))&(df.Names!='pizza')
b= (df.Names.str.endswith('o'))|(df.Names.str.endswith('i'))|(df.Names=='pizza')




df['N']=np.where(a, 'c', np.where(b,'m',df.Names))

import numpy as np
a= (df.Names.str.endswith('a'))&(df.Names!='pizza')
b= (df.Names.str.endswith('o'))|(df.Names.str.endswith('i'))|(df.Names=='pizza')




df['N']=np.where(a, 'c', np.where(b,'m',df.Names))