Проблемы при попытке преобразовать строки, содержащие определенный текст, используя словарь и карту - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь переименовать строки в моем фрейме данных, используя словарь и функцию карты. Проблема в том, что некоторые строки не имеют одинакового текста.

Вот код, который у меня есть:

fb_posts['title'] = fb_posts['title'].astype(str)
def converts(i):
  if 'link' in i:
    i == 'link'
  elif 'post' in i:
    i == 'post'
  elif 'status' in i:
    i == 'stats'
  elif 'timeline' in i:
    i == 'timeline'
  return i
fb_posts['title'] = fb_posts['title'].apply(converts(i))

Итак, я начал с преобразования всего столбца в строки, чтобы я мог найти, содержит ли строка определенную букву, и преобразовал строку в соответствии с этим.

Однако при этом возвращается следующая трассировка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-310-6ddc37cbbb4d> in <module>()
----> 1 fb_posts['title'] = fb_posts['title'].apply(converts(i))

/usr/local/lib/python3.6/dist-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   2532         # if we are a string, try to dispatch
   2533         if isinstance(func, compat.string_types):
-> 2534             return self._try_aggregate_string_function(func, *args, **kwds)
   2535 
   2536         # handle ufuncs and lambdas

/usr/local/lib/python3.6/dist-packages/pandas/core/base.py in _try_aggregate_string_function(self, arg, *args, **kwargs)
    307             return f(self, *args, **kwargs)
    308 
--> 309         raise ValueError("{arg} is an unknown string function".format(arg=arg))
    310 
    311     def _aggregate(self, arg, *args, **kwargs):

ValueError: Person updated his status. is an unknown string function

Вот пример моей базы данных:

 title   
Person shared a link.
Person shared a post.
Person posted on x's timeline
Person posted on y's timeline
Person posted on a's timeline

Ответы [ 4 ]

0 голосов
/ 14 января 2019

Еще один ответ ...

Я держался близко к вашему коду, но немного изменил функцию.

def converts(row):
    for i in ['link', 'post', 'status', 'timeline']:
        if i in row['title']:
            return i
    return row['title']

fb_posts['title'] = fb_posts['title'].apply(lambda x: converts(x), axis=1)
0 голосов
/ 14 января 2019

Попробуйте либо -

fb_posts['title'] = fb_posts['title'].apply(converts)

OR

fb_posts['title'] = fb_posts['title'].apply(lambda x: converts(x))

Вам необходимо передать объект function в качестве параметра функции apply

0 голосов
/ 14 января 2019

Для небольшого числа категорий может быть эффективен простой цикл:

for x in ['link', 'post', 'status', 'timeline']:
    fb_posts.loc[fb_posts['title'].str.contains(x, regex=False), 'title'] = x

Решения Regex также могут работать, но обычно они более эффективны, когда у вас есть большое количество категорий.

0 голосов
/ 14 января 2019

Снова используя findall с |

df.title.str.findall('link|post|status|timeline').str[-1]
Out[103]: 
0        link
1        post
2    timeline
3    timeline
4    timeline
Name: title, dtype: object
...