1
votes

Comment appliquer la méthode de fractionnement de chaîne sur une trame de données pandas en fonction d'une condition?

Je souhaite remplacer certaines valeurs de mon dataframe qui ont été saisies dans le mauvais format. Par exemple, 850 / 07-498745 doit être 07-498745. Maintenant, j'ai utilisé la division de chaîne avec succès pour le faire. Cependant, il transforme toutes les chaînes précédemment correctement formatées en NaN. J'ai essayé de le baser sur une condition, mais j'ai toujours le même problème. Comment puis-je résoudre ce problème?

Exemple d'entrée:

df['mycolumn'] = df[df.mycolumn.str.contains('/') == True].mycolumn.str.split('/', 1).str[1]
df

Ma tentative:

mylist = ['850/07-498745', '850/07-148465', '07-499015']
df = pd.DataFrame(mylist)
df.rename(columns={ df.columns[0]: "mycolumn" }, inplace = True)

Sortie: p >

 entrez la description de l'image ici

Ce que je voulais:

 entrez la description de l'image ici


1 commentaires

Suivant votre logique, ce serait: df.loc [df.mycolumn.str.contains ('/'), 'mycolumn'] = df.mycolumn.str.split ('/'). Str [1] . Mais dans ce cas, la réponse anky_91 a plus de sens.


3 Réponses :


2
votes

Vous pouvez utiliser split avec / et récupérer la dernière chaîne de retour de la liste:

df['mycolumn'].str.split('/').str[-1]

0    07-498745
1    07-148465
2    07-499015
Name: mycolumn, dtype: object


0 commentaires

1
votes

Pour une solution regex:

0    07-498745
1    07-148465
2    07-499015
Name: 0, dtype: object

Sortie:

df.mycolumn.str.extract('(?:.*/)?(.*)$')[0]


0 commentaires

2
votes

Cela fonctionnerait également et pourrait vous aider à comprendre pourquoi votre tentative initiale n'a pas fonctionné:

mask = df.mycolumn.str.contains('/')
df.mycolumn.loc[mask] = df.mycolumn[mask].str.split('/', 1).str[1]

Vous faisiez df ['mycolumn'] = ... code >, qui, je crois, ne fait que remplacer la série entière de cette colonne par la nouvelle que vous avez formée.


0 commentaires