web-dev-qa-db-fra.com

Python pandas: tout supprimer après un délimiteur dans une chaîne

J'ai des trames de données qui contiennent par exemple:

"vendor a::ProductA"
"vendor b::ProductA
"vendor a::Productb"

Je dois supprimer tout (et y compris) les deux :: pour que je me retrouve avec:

"vendor a"
"vendor b"
"vendor a"

J'ai essayé str.trim (qui semble ne pas exister) et str.split sans succès. quelle serait la façon la plus simple d'y parvenir?

13
f0rd42

Vous pouvez utiliser pandas.Series.str.split comme vous utiliseriez normalement split. Juste divisé sur la chaîne '::', et indexez la liste créée à partir de la méthode split:

>>> df = pd.DataFrame({'text': ["vendor a::ProductA", "vendor b::ProductA", "vendor a::Productb"]})
>>> df
                 text
0  vendor a::ProductA
1  vendor b::ProductA
2  vendor a::Productb
>>> df['text_new'] = df['text'].str.split('::').str[0]
>>> df
                 text  text_new
0  vendor a::ProductA  vendor a
1  vendor b::ProductA  vendor b
2  vendor a::Productb  vendor a

Voici une solution non pandas:

>>> df['text_new1'] = [x.split('::')[0] for x in df['text']]
>>> df
                 text  text_new text_new1
0  vendor a::ProductA  vendor a  vendor a
1  vendor b::ProductA  vendor b  vendor b
2  vendor a::Productb  vendor a  vendor a

Modifier: voici l'explication étape par étape de ce qui se passe dans pandas ci-dessus:

# Select the pandas.Series object you want
>>> df['text']
0    vendor a::ProductA
1    vendor b::ProductA
2    vendor a::Productb
Name: text, dtype: object

# using pandas.Series.str allows us to implement "normal" string methods 
# (like split) on a Series
>>> df['text'].str
<pandas.core.strings.StringMethods object at 0x110af4e48>

# Now we can use the split method to split on our '::' string. You'll see that
# a Series of lists is returned (just like what you'd see outside of pandas)
>>> df['text'].str.split('::')
0    [vendor a, ProductA]
1    [vendor b, ProductA]
2    [vendor a, Productb]
Name: text, dtype: object

# using the pandas.Series.str method, again, we will be able to index through
# the lists returned in the previous step
>>> df['text'].str.split('::').str
<pandas.core.strings.StringMethods object at 0x110b254a8>

# now we can grab the first item in each list above for our desired output
>>> df['text'].str.split('::').str[0]
0    vendor a
1    vendor b
2    vendor a
Name: text, dtype: object

Je suggérerais de vérifier les pandas.Series.str docs , ou, mieux encore, Travailler avec les données de texte dans pandas .

36
blacksite

Vous pouvez utiliser str.replace(":", " ") pour supprimer le "::". Pour diviser, vous devez spécifier le caractère dans lequel vous souhaitez diviser: str.split(" ")

La fonction de trim est appelée strip en python: str.strip()

De plus, vous pouvez faire str[:7] Pour obtenir juste "vendor x" Dans vos chaînes.

Bonne chance

1
Mohamed AL ANI