首页 > 解决方案 > 可靠地处理 pandas 中的 nans

问题描述

什么是最好的和希望最简单的方法来编写 NaN,同时注意不同的情况?

在此示例df中,我想Routed (Expected) Site根据业务逻辑替换其中的 NaN:

   DBN     DBN - Exam Routed (Expected) Site
00000A  00000A - Scie                 A00000
750000  750000 - Scie                    NaN
840000  840000 - Scie                    NaN

我想

   DBN     DBN - Exam Routed (Expected) Site
00000A  00000A - Scie                 A00000
750000  750000 - Scie          75 (Hospital)
840000  840000 - Scie           84 (Charter)

我使用此代码实际上并未指示 NaN 是哪种情况:

df['Routed (Expected) Site'].fillna('Charter or Hospital',inplace=True)

我也试过这个,它以某种方式覆盖了所有的Routed (Expected) Sites None

def routed_site_exceptions(DBN, routed_site):
    DBN = str(DBN)
    if DBN.startswith("84") and not routed_site:
        return '84 (Charter)'
    if DBN.startswith('75') and not routed_site:
        return '75 (Hospital)'
df['Routed (Expected) Site'] = np.vectorize(routed_site_exceptions)(df['DBN'],
                                                                    df['Routed (Expected) Site'])

标签: pythonpandas

解决方案


fillnamap

我假设我不知道您的业务逻辑将包含的所有内容。所以我保持它相当概括。

def routed_site_exceptions(DBN):
    DBN = str(DBN)
    if DBN.startswith("84"):
        return '84 (Charter)'
    if DBN.startswith('75'):
        return '75 (Hospital)'

df.fillna({'Routed (Expected) Site': df.DBN.map(routed_site_exceptions)})

      DBN     DBN - Exam Routed (Expected) Site
0  00000A  00000A - Scie                 A00000
1  750000  750000 - Scie          75 (Hospital)
2  840000  840000 - Scie           84 (Charter)

推荐阅读