如何在Python的Pandas中应用多个条件?

3

如何在pandas中应用多个条件? 例如,我有这个数据框

Country   VAT        
RO       RO1449488
RO       RO1449489
RO       RO1449486
MD       2980409450027

例如,我希望对于国家代码为RO的情况下,从VAT中删除"RO"并只保留数字。 或者,例如如果该国家不是RO且VAT为13,则在VAT前面添加"03"。
输出结果应如下:
Country   VAT        
RO       1449488
RO       1449489
RO       1449486
MD       032980409450027

我知道如何使用openpyxl来完成这个任务,但是对于pandas我还不熟悉,我发现pandas的语法更难理解。

2个回答

3

如果你不想使用@mozway的简短代码,你可以使用apply()在DataFrame上进行任何修改。将你的代码定义为一个函数:

def myFunc(x):
    if x['VAT'].startswith("RO"):
        result = x['VAT'][2:]
    elif x['Country'] != 'RO' and len(x['VAT']) == 13:
        result = "03" + x['VAT']
    # add other conditions here

    return result

然后你可以使用 axis=1 逐行将其应用于 DataFrame。

df['VAT'] = df.apply(myFunc, axis=1)

# Output
  Country              VAT
0      RO          1449488
1      RO          1449489
2      RO          1449486
3      MD  032980409450027

apply 相当于一个循环,对于大型数据集来说速度会比较慢。 - mozway
我知道apply比你的解决方案更接近循环,但是使用pandas库中的函数是否仍然比不使用iterrow()iteritems()迭代的普通自定义循环更好呢? - Titouan L
1
就性能而言,可能不行(就清晰度而言,是的)。 - mozway
请注意,我没有给您的答案投反对票,如果不需要性能,它仍然是完全有效的。 - mozway

3
你可以使用numpy.select进行布尔选择:
import numpy as np
                       # condition1            condition2
df['VAT'] = np.select([df['Country'].eq('RO'), df['VAT'].str.len().eq(13)],
                       # replacement1      
                      [df['VAT'].str.replace('^RO', '', regex=True),
                      '03'+df['VAT']], # replacement2
                       df['VAT']       # default
                     )

输出:

  Country              VAT
0      RO          1449488
1      RO          1449489
2      RO          1449486
3      MD  032980409450027

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接