2 votes

Traiter de manière fiable les nans dans les pandas

Quelle est la meilleure et, je l'espère, la plus simple façon d'écrire sur les NaN, en notant également les différents cas ?

Dans cet exemple df Je veux remplacer les NaNs dans Routed (Expected) Site en fonction de la logique de l'entreprise :

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

Je veux

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

J'utilise ce code qui, en fait, n'indique pas de quel cas il s'agit :

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

J'ai également essayé ceci qui, d'une certaine manière, a annulé tous les Routed (Expected) Site avec 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'])

4voto

piRSquared Points 159

fillna et map

Je pars du principe que je ne connais pas toute la logique de votre entreprise. J'ai donc gardé une certaine généralité.

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)

2voto

Quang Hoang Points 191

Comme décrit, vous pouvez le faire :

# get the new values
s = df.DBN.str[:2].map({'75': '75 (Hospital)',
                        '84': '84 (Charter)'})

# map to the data
df['Routed (Expected) Site'].fillna(s, inplace=True)

Sortie :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X