Без однозначного разделителя это не тривиально, поскольку у вас есть оба пробела в именах, несколько длин имен (2 слова, 3 слова) и конечный столбец, который также может иметь несколько слов с пробелами.
Разделив строку, вы можете получить это частичное решение:
df['data2'] = df['data1'].str.split(': ').str[-1]
>>> print(df)
data1 data2
0 info name: Michael Jackson New York Michael Jackson New York
1 info 12 name: Michael Jordan III Los Angeles Michael Jordan III Los Angeles
Если бы у вас был список «городов», вы могли бы выполнить полное решение:
def replace(string, substitutions):
"""Replaces multiple substrings in a string."""
substrings = sorted(substitutions, key=len, reverse=True)
regex = re.compile('|'.join(map(re.escape, substrings)))
return regex.sub(lambda match: substitutions[match.group(0)], string)
# List of cities to remove from strings
cities = ['New York', 'Los Angeles']
# Dictionary matching each city with the empty string
substitutions = {city:'' for city in cities}
# Splitting to create new column as above
df['data2'] = df['data1'].str.split(': ').str[-1]
# Applying replacements to new column
df['data2'] = df['data2'].map(lambda x: replace(x, substitutions).strip())
>>>print(df)
data1 data2
0 info name: Michael Jackson New York Michael Jackson
1 info 12 name: Michael Jordan III Los Angeles Michael Jordan III
Кредит Карлсмит для функции замены.
Самой явной и расстраивающей проблемой является API хранилища данных, который выглядит большим и очень хорошо продуман и легок работать с тем, если Вы привыкли к SQL, но имеет 1 000 пределов строки через все наборы результатов запроса, и Вы не можете получить доступ к количествам или смещениям кроме того. Я столкнулся с более странными проблемами, с не на самом деле способность добавить или получить доступ к данным для модели, после того как это идет вне 1 000 строк.
Посмотрите дискуссию Переполнения стека о 1 000 пределов строки
Балканское Аральское море записало действительно хорошую сводку этого и других проблем
Однако механизм приложения является действительно большим инструментом, чтобы иметь в распоряжении, и я действительно люблю работать с ним. Это идеально подходит для развертывания микро веб-сервисов (например: API json) для использования в других приложениях.
GQL чрезвычайно прост - это - подмножество оператора 'SELECT' SQL, ничто больше. Это - только слой удобства поверх API низшего уровня, тем не менее, и весь парсинг сделан в Python.
Вместо этого я рекомендую использовать Запрос API, который является процедурным, не требует никакого парсинга во время выполнения и делает 'уязвимости' инжекции GQL полностью невозможными (хотя они невозможны в правильно записанном GQL так или иначе). Запрос API очень прост: Назовите .all () на Образцовом классе или дб вызова. Запрос (modelname). Объект Запроса имеет .filter (field_and_operator, значение), .order (field_and_direction) и .ancestor (объект) методы, в дополнение ко всем средствам, которые объекты GQL имеют (.get (), .fetch (), .count ()), и т.д.), каждый из Методов запроса возвращает сам объект Запроса для удобства, таким образом, можно объединить их в цепочку:
результаты = MyModel.all () .filter ("нечто = ", 5) .order (" - панель") .fetch (10)
Эквивалентно:
результаты = MyModel.gql ("ГДЕ нечто = 5 панелей ORDER BY ПРЕДЕЛ DESC 10") .fetch ()
Главная оборотная сторона, когда работа с AppEngine была пределом запроса 1k, который уже был упомянут в комментариях. Что я не видел упомянутый, хотя то, что существует встроенный поддающийся сортировке порядок, с которым можно работать вокруг этой проблемы. Из appengine поваренной книги:
def deepFetch(queryGen,key=None,batchSize = 100): """Iterator that yields an entity in batches. Args: queryGen: should return a Query object key: used to .filter() for __key__ batchSize: how many entities to retrieve in one datastore call Retrieved from http://tinyurl.com/d887ll (AppEngine cookbook). """ from google.appengine.ext import db # AppEngine will not fetch more than 1000 results batchSize = min(batchSize,1000) query = None done = False count = 0 if key: key = db.Key(key) while not done: print count query = queryGen() if key: query.filter("__key__ > ",key) results = query.fetch(batchSize) for result in results: count += 1 yield result if batchSize > len(results): done = True else: key = results[-1].key()
Вышеупомянутый код вместе с Удаленным API (см. эту статью) позволяет Вам получать столько объектов, сколько Вам нужно.
Можно использовать вышеупомянутый код как это:
def allMyModel(): q = MyModel.all() myModels = deepFetch(allMyModel)
Механизм Приложения Google не использует фактическую базу данных и по-видимому использует своего рода распределенную карту хеша. Это предоставит себя некоторым различным поведениям, которые люди, которые приучены к SQL просто, не собираются видеть сначала. Таким образом, например, получение КОЛИЧЕСТВА объектов в регулярном SQL, как ожидают, будет быстрой операцией, но с GQL это просто не собирается работать тот же путь.
Вот еще некоторые проблемы:
http://blog.burnayev.com/2008/04/gql-limitations.html
В моем личном опыте это - корректировка, но кривая обучения прекрасна.
Сначала у меня был тот же опыт как другие, которые перешли от SQL до GQL - довольно странный, чтобы не смочь сделать СОЕДИНЕНИЯ, считать больше чем 1 000 строк, и т.д. Теперь, когда я работал с ним в течение нескольких месяцев, я абсолютно люблю механизм приложения. Я портирую все свои старые проекты на него.
Я использую его для хостинга нескольких веб-приложений интенсивного трафика (в пиковое время, которое получает один из них, 50k поражает минуту.)
У меня был отличный опыт работы с движком приложений Google, и ограничение результатов 1000 было удалено , вот ссылка на примечания к выпуску:
выпуск движка приложения примечания
Не более 1000 результатов - это верно: с добавлением курсоров и кульминацией множества небольших улучшений стабильности и производительности хранилища данных по сравнению с в последние несколько месяцев теперь мы достаточно уверены в том, что полностью удалили ограничение максимального результата. Выполняете ли вы выборку, итерацию или используете Курсор, нет ограничений на количество результатов.