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/...