37 votes

pandas - convertit une chaîne de caractères en liste de chaînes de caractères

J'ai ce fichier 'file.csv' à lire avec pandas :

Title|Tags
T1|"[Tag1,Tag2]"
T1|"[Tag1,Tag2,Tag3]"
T2|"[Tag3,Tag1]"

en utilisant

df = pd.read_csv('file.csv', sep='|')

le résultat est :

  Title              Tags
0    T1       [Tag1,Tag2]
1    T1  [Tag1,Tag2,Tag3]
2    T2       [Tag3,Tag1]

Je sais que la colonne Tags est une chaîne complète, puisque :

In [64]: df['Tags'][0][0]
Out[64]: '['

Je dois le lire comme une liste de chaînes de caractères comme ["Tag1","Tag2"] . J'ai essayé la solution fournie dans este mais je n'ai pas eu de chance, puisque j'ai le numéro de téléphone de l'entreprise. [ y ] des personnages qui mettent réellement le bazar.

La sortie attendue devrait être :

In [64]: df['Tags'][0][0]
Out[64]: 'Tag1'

51voto

Mike Müller Points 2963

Vous pouvez diviser la chaîne manuellement :

>>> df['Tags'] = df.Tags.apply(lambda x: x[1:-1].split(','))
>>> df.Tags[0]
['Tag1', 'Tag2']

15voto

RHSmith159 Points 670

Je pense que vous pourriez utiliser le module json.

import json
import pandas

df = pd.read_csv('file.csv', sep='|')
df['Tags'] = df['Tags'].apply(lambda x: json.loads(x))

Ainsi, le cadre de données sera chargé comme précédemment, puis une fonction lambda sera appliquée à chacun des éléments du cadre de données. Tags colonne. La fonction lambda appelle json.loads() qui convertit la représentation en chaîne de la liste en une liste réelle.

11voto

W-B Points 94428

O

df.Tags=df.Tags.str[1:-1].str.split(',').tolist()

5voto

Scott Boston Points 48995

Vous pouvez convertir la chaîne en une liste en utilisant strip y split .

df_out = df.assign(Tags=df.Tags.str.strip('[]').str.split(','))

df_out.Tags[0][0]

Sortie :

'Tag1'

2voto

Veggiet Points 95

Votre df['Tags'] semble être une liste de chaînes de caractères. Si vous imprimez cette liste, vous devriez obtenir ["[tag1,tag2]","[Tag1,Tag2,Tag3]","[Tag3,Tag1]"] C'est pourquoi, lorsque vous appelez le premier élément du premier élément, vous obtenez en fait le premier caractère de la chaîne, plutôt que ce que vous voulez.

Vous devez soit analyser cette chaîne par la suite. En effectuant quelque chose comme

df['Tags'][0] = df['Tags'][0].split(',')

Mais, comme vous l'avez vu dans l'exemple cité, cela vous donnera une liste qui ressemble à ceci

in: df['Tags'][0][0] 
out: '[tag1'`

Ce dont vous avez besoin, c'est d'un moyen d'analyser la chaîne en éditant les caractères multiples. Vous pouvez utiliser une simple expression regex pour ce faire. Quelque chose comme :

 import re
 df['Tags'][0] = re.findall(r"[\w']+", df['Tags'][0])
 print(df['Tags'][0][0])

s'imprimera :

 'tag1'

En utilisant l'autre réponse impliquant les convertisseurs Pandas, vous pourriez écrire un convertisseur comme celui-ci :

 def clean(seq_string):
      return re.findall(r"[\w']+", seq_string)

Si vous ne connaissez pas les regex, ils peuvent être assez puissants, mais aussi imprévisibles si vous n'êtes pas sûr du contenu de vos chaînes d'entrée. L'expression utilisée ici r"[\w']+" correspondra à tous les caractères alphanumériques et les caractères de soulignement des mots courants et traitera tout le reste comme un point pour re.findall pour diviser la liste.

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