J'ai des adresses que j'aimerais nettoyer.
Vous pouvez voir que dans la colonne adresse1
, nous avons des entrées qui ne sont que des nombres, où elles devraient être des nombres et des noms de rue comme les trois premières lignes.
df['address1'] = df.apply(f,axis=1)
3 Réponses :
Vous pouvez créer un masque et mettre à jour:
address1 address2 0 15 Main Street New York 1 10 High Street LA 2 5 Other Street London 3 NaN Tokyo 4 15 Grove Street NaN 5 12 Garden Street NaN
sortie:
mask = pd.to_numeric(df.address1, errors='coerce').notna() df.loc[mask, 'address1'] = df.loc[mask, 'address1'] + ' ' +df.loc[mask,'address2'] df.loc[mask, 'address2'] = np.nan
Essayez ceci
appliquez essayez sauf et convertissez l'adresse1 en int
address1 address2 0 15 Main Street New York 1 10 High Street LA 2 5 Other Street London 3 NaN Tokyo 4 15 Grove Street NaN 5 12 Garden Street NaN
def test(row): try: address = int(row['address1']) return 1 except: return 0 df['address1'] = np.where(df['test']==1,df['address1']+ ' '+df['address2'],df['address1']) df['address2'] = np.where(df['test']==1,np.nan,df['address2']) df.drop(['test'],axis=1,inplace=True)
Vous pouvez éviter apply
en utilisant str.isdigit
pour sélectionner les lignes exactes à modifier. Créez un masque m
pour identifier ces lignes. Utilisez agg
sur ces lignes et construisez une sous-trame de données pour ces lignes. Enfin, ajoutez
à l'original df
def f(x): y = x.copy() try: #if address1 is int if isinstance(int(x['address1']), int): # create new address using address1 + address 2 y['address1'] = str(x['address1']) +' '+ str(x['address2']) # delete address2 y['address2'] = np.nan except: pass return y df.apply(f, axis=1) Out[213]: address1 address2 0 15 Main Street New York 1 10 High Street LA 2 5 Other Street London 3 NaN Tokyo 4 15 Grove Street NaN 5 12 Garden Street NaN
Enfin, ajoutez
à df code>
df[~m].append(df1) Out[200]: address1 address2 0 15 Main Street New York 1 10 High Street LA 2 5 Other Street London 3 NaN Tokyo 4 15 Grove Street NaN 5 12 Garden Street NaN
Si vous insistez toujours pour utiliser apply
, vous devez modifier f
pour retourner en dehors de si
pour renvoyer des lignes non modifiées avec des lignes modifiées
m = df.address1.astype(str).str.isdigit() df1 = df[m].agg(' '.join, axis=1).to_frame('address1').assign(address2=np.nan) Out[179]: address1 address2 4 15 Grove Street NaN 5 12 Garden Street NaN
Remarque : il est recommandé que s'applique
ne doit pas modifier l'objet passé, donc je fais y = x.copy ()
et modifie et renvoie y
Merci. Pourquoi est-il recommandé que apply ne modifie pas l'objet passé? Avez-vous des informations sur lesquelles je peux lire?
@SCool: il peut parfois renvoyer un résultat imprévisible comme dans ce fil: stackoverflow.com/questions/56961451/...