Панды Python: удалите все после разделителя в строке

#python #pandas #database

Вопрос:

У меня есть фреймы данных, которые содержат, например:

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

Мне нужно удалить все (и в том числе) два::, чтобы в итоге я получил:

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

Я попробовал str.trim (которого, похоже, не существует) и str.split без успеха.
каков был бы самый простой способ сделать это?

Комментарии:

1. str.split можешь это сделать — как ты это пробовал?

Ответ №1:

Вы можете использовать его pandas.Series.str.split так же, как split обычно. Просто разделите строку '::' и проиндексируйте список , созданный с 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
 

Вот решение, не связанное с пандами:

 >>> 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
 

Редактировать: Вот пошаговое объяснение того, что происходит pandas выше:

 # 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
 

Я бы посоветовал проверить панд.Документы Series.str или, еще лучше, работа с текстовыми данными в панд.

Комментарии:

1. Я пробовал str.split(‘::’) раньше, но безуспешно. Что делает .str[0] в конце?

2. Он принимает первый аргумент каждого списка и возвращает его (str[0] = «поставщик a», «поставщик b», «поставщик c», str[1] будет «ProductA», «ProductB», «ProductC»)

3. как бы вы применили это для нескольких столбцов?

Ответ №2:

Если он находится в определенном столбце (с именем: столбец) фрейма данных (с именем: фрейм данных), вы также можете использовать

 dataframe.column.str.replace("(::).*","")
 

Это дает вам следующий результат

          column        new_column       
0  vendor a::ProductA  vendor a
1  vendor b::ProductA  vendor b
2  vendor a::Productb  vendor a
 

Используя это, вам не нужно указывать какую-либо позицию, так как она избавляется от всего, что присутствует после ‘::

Я думаю,это может прийти, о, помогите, удачи!

Ответ №3:

Вы можете использовать str.replace(":", " ") для удаления "::" . Чтобы разделить, вам нужно указать символ, на который вы хотите разделить: str.split(" ")

Функция обрезки в python называется полосой: str.strip()

Кроме того, вы можете сделать str[:7] так, чтобы попасть только "vendor x" в свои строки.

Удачи

Комментарии:

1. не могу сделать str[:7], так как имена поставщиков имеют разную длину