6 votes

Remplacer une colonne pandas en divisant le texte en fonction de "_"

J'ai un dataframe pandas comme ci-dessous

import pandas as pd
df = pd.DataFrame({'col':['abcfg_grp_202005', 'abcmn_abc_202009', 'abcgd_xyz_8976', 'abcgd_lmn_1']})
df

    col
0   abcfg_grp_202005
1   abcmn_abc_202009
2   abcgd_xyz_8976
3   abcgd_lmn_1

Je veux remplacer 'col' comme première instance avant _ dans "col". S'il y a un seul chiffre dans la troisième instance après _, alors ajoutez-le à la fin de "col" comme ci-dessous

    col
0   abcfg
1   abcmn
2   abcgd
3   abcgd_1

3voto

Mayank Porwal Points 27156

Vous pouvez utiliser df.apply :

In [1441]: df['col'] = df.col.str.split('_', expand=True).apply(lambda x: (x[0] + '_' + x[2]) if len(x[2]) == 1 else x[0], axis=1)

In [1442]: df
Out[1442]: 
       col
0    abcfg
1    abcmn
2    abcgd
3  abcgd_1

2voto

ALollz Points 23271

Divisez les caractères de soulignement, puis ajoutez les chaînes de caractères. Ici, nous pouvons utiliser l'astuce que False multipliée par une chaîne de caractères renvoie la chaîne vide pour gérer l'addition conditionnelle. Le contrôle est une chaîne de 1 caractère qui est un chiffre.

df1 = df['col'].str.split('_', expand=True)
df['col'] = df1[0] + ('_' + df1[2])*(df1[2].str.len().eq(1) & df1[2].str.isdigit())

print(df)

       col
0    abcfg
1    abcmn
2    abcgd
3  abcgd_1

2voto

venky__ Points 479

Vous pouvez appliquer une fonction personnalisée.

import pandas as pd
df = pd.DataFrame({'col':['abcfg_grp_202005', 'abcmn_abc_202009', 'abcgd_xyz_8976', 'abcgd_lmn_1']})
def func(x):
    ar = x.split('_')
    if len(ar[2]) == 1 and ar[2].isdigit():
        return ar[0]+"_"+ar[2]
    else:
        return ar[0]

df['col'] = df['col'].apply(lambda x: func(x))
df

    col
0   abcfg
1   abcmn
2   abcgd
3   abcgd_1

1voto

NYC Coder Points 6152

Voici une autre façon de procéder :

df['col'] = np.where(df['col'].str.contains(r'[a-zA-Z0-9]+_[a-zA-Z0-9]+_[0-9]\b', regex=True),
                     df['col'].str.split('_').str[0] + '_' +  df['col'].str.split('_').str[2],
                     df['col'].str.split('_').str[0])
print(df)

       col
0    abcfg
1    abcmn
2    abcgd
3  abcgd_1

0voto

Tim Biegeleisen Points 53335

Ce n'est peut-être pas la réponse la plus élégante, mais je recommanderais d'utiliser str.replace deux fois ici :

df["col"]= df["Team"]
    .str.replace("^([^_]+)_.*?(?!_\d$).{2}$", "\\1")
    .str.replace("_[^_]+(?=_)", "")

La première expression rationnelle vise les entrées de la forme abcfg_grp_202005 qui ne se terminent pas par un trait de soulignement suivi d'un chiffre. Dans ce cas, nous aurions abcfg . La deuxième regex supprime le terme de soulignement du milieu, s'il existe encore, ce qui ne serait vrai que pour des entrées telles que abcgd_lmn_1 se terminant par un trait de soulignement suivi d'un chiffre.

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