J'ai une colonne dans un df qui ressemble à ceci:

pd.DataFrame(["[u'one_element']", "[u'two_elememts', u'two_elements']", "[u'three_elements', u'three_elements', u'three_elements']"])

    0
0   [u'one_element']
1   [u'two_elememts', u'two_elements']
2   [u'three_elements', u'three_elements', u'three_elements']

Ces éléments sont des chaînes:

type(df[0].iloc[2]) == str

Le résultat final devrait ressembler à:

    0
0   one_element
1   two_elememts, two_elements
2   three_elements, three_elements, three_elements

J'ai essayé avec:

df[column] = df[column].map(lambda x: x.lstrip('[u').rstrip(']').replace("u'","").replace("'",""))

Mais évidemment, cela est lent lorsque vous avez plusieurs lignes.

Y a-t-il une meilleure façon de le faire? Le df a de nombreuses colonnes de différents types: chaînes, entiers, flottants.

Merci!

0
Claudiu Creanga 23 mai 2018 à 14:06

3 réponses

Meilleure réponse

Vous pouvez utiliser regex et strip i.e

df[0] = df[0].str.strip("[]").str.replace("u'|'",'')

0                                       one_element
1                        two_elememts, two_elements
2    three_elements, three_elements, three_elements
Name: 0, dtype: object
3
Bharath 23 mai 2018 à 11:22

Vous n'avez pas besoin de carte, vous pouvez utiliser l'attribut str pour série pandas:

(df[0].str.lstrip('[u')
           .str.rstrip(']')
           .str.replace("u'","")
           .str.replace("'","")))

Obtient le même résultat mais n'utilise pas la carte

0                                       one_element
1                        two_elememts, two_elements
2    three_elements, three_elements, three_elements
Name: 0, dtype: object
1
Quickbeam2k1 23 mai 2018 à 11:17

Utilisation du module ast .

import pandas as pd
import ast
df = pd.DataFrame(["[u'one_element']", "[u'two_elememts', u'two_elements']", "[u'three_elements', u'three_elements', u'three_elements']"])
print(df[0].apply(lambda x: ", ".join(ast.literal_eval(x))))

Sortie:

0                                       one_element
1                        two_elememts, two_elements
2    three_elements, three_elements, three_elements
Name: 0, dtype: object
1
Rakesh 23 mai 2018 à 11:14