1
votes

Appliquer l'opération pour concaténer certaines lignes dans le réajustement de la trame de données Aucun

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)


0 commentaires

3 Réponses :


1
votes

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


0 commentaires

1
votes

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)


0 commentaires

1
votes

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


2 commentaires

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