8 votes

Méthode pythique pour appliquer une expression rationnelle à toutes les colonnes d'un cadre de données.

J'ai un cadre de données contenant des mots-clés et des valeurs dans toutes les colonnes. Voir l'exemple ci-dessous.

Input DataFrame

Je veux appliquer le regex à toutes les colonnes. J'utilise donc une boucle for et j'applique la regex :

for i in range (1,maxExtended_Keywords):
    temp = 'extdkey_' + str(i)
    Extended_Keywords[temp] = Extended_Keywords[temp].str.extract(":(.*)",expand=True)

Et j'obtiens le résultat final souhaité. Aucun problème.

Desired output

Cependant, je suis curieux de savoir s'il existe un moyen pythique d'appliquer une expression rationnelle à l'ensemble du cadre de données au lieu d'utiliser une boucle for et de l'appliquer à chaque colonne.

Merci,

8voto

piRSquared Points 159

Utilisez pandas.DataFrame.replace con regex=True

df.replace('^.*:\s*(.*)', r'\1', regex=True)

Remarquez que mon modèle utilise des parenthèses pour capturer la partie après l'élément ':' et utilise une chaîne brute r'\1' pour faire référence à ce groupe de capture.


MCVE

df = pd.DataFrame([
    [np.nan, 'thing1: hello'],
    ['thing2: world', np.nan]
], columns=['extdkey1', 'extdkey2'])

df

        extdkey1       extdkey2
0            NaN  thing1: hello
1  thing2: world            NaN

df.replace('^.*:\s*(.*)', r'\1', regex=True)

  extdkey1 extdkey2
0      NaN    hello
1    world      NaN

1voto

romulomadu Points 369

Vous pouvez utiliser applymap, qui appliquera une fonction pour chaque élément du cadre de données, pour ce problème, vous pouvez le faire :

func = lambda x: re.findall('^.*:\s*(.*)', x)[0] if re.findall('^.*:\s*(.*)', str(x)) else x
df.applymap(func)

Attention : Éviter d'utiliser applymap pour les gros volumes de données pour des raisons d'efficacité.

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