#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], так как имена поставщиков имеют разную длину