使用条件语句处理 Pandas 中的 NaN 值

Rya*_*ies 5 python pandas

我正在处理一些客户邮政编码数据无效的数据。因此,我无法将 CountryISOCode 映射到导致 NaN 的邮政编码。但是,我注意到对于所有带有 NaN 的 CountryISOCode,CurrencyCode 可以为我提供足够的信息来暂时解决问题。

我已经阅读了各种 Stackoverflow 文章,但找不到解决我的问题的方法。我试过了...

def func(row):
    if row['CountryISOCode'] == np.nan & row['Currency'] == 'EUR':
        return 'IRE'
elif row['CountryISOCode'] == np.nan & row['Currency'] == 'GBP':
    return 'GBR'
else:
    return row['CountryISOCode']

df['CountryISOCode'] = df.apply(func, axis=1)
Run Code Online (Sandbox Code Playgroud)

和其他一些方法,但无济于事......

下面我提供了我正在使用的数据的复制

import pandas as pd
import numpy as np

data = [
    ['Steve', 'Invalid Postcode', 'GBP', np.nan ],
    ['Robyn', 'Invalid Postcode', 'EUR', np.nan],
    ['James', 'Valid Postcode', 'GBP', 'GBR'],
    ['Halo', 'Invalid Postcode', 'EUR', np.nan],
    ['Jesus', 'Valid Postcode', 'GBP', 'GBR']
    ]

df = pd.DataFrame(columns=["Name", "PostCode", "CurrencyCode", "CountryISOCode"], data=data)
Run Code Online (Sandbox Code Playgroud)

基本上,如果我使用 SQL,我的代码将如下所示。

IF countryISOCode IS NULL 
    AND currency = ‘GBP’ 
THEN CountryISOCode =  ‘GBR’
ELSE
IF countryISOCode IS NULL 
    AND currency = ‘EUR 
THEN CountryISOCode =  ‘IRE’
ELSE countryISOCode 
END
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

jpp*_*jpp 3

当货币代码有帮助时,您可以使用fillna指定映射的字典:

cmap = {'GBP': 'GBR', 'EUR': 'IRE'}
df['CountryISOCode'] = df['CountryISOCode'].fillna(df['CurrencyCode'].map(cmap))

print(df)

    Name          PostCode CurrencyCode CountryISOCode
0  Steve  Invalid Postcode          GBP            GBR
1  Robyn  Invalid Postcode          EUR            IRE
2  James    Valid Postcode          GBP            GBR
3   Halo  Invalid Postcode          EUR            IRE
4  Jesus    Valid Postcode          GBP            GBR
Run Code Online (Sandbox Code Playgroud)