麻烦尝试使用字典和地图转换包含特定文本的行

时间:2019-01-14 16:16:20

标签: python string pandas data-science

我正在尝试使用字典和map函数重命名数据框中的行。问题是某些行没有相同的文本。

这是我的代码:

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 :(得分:2)

再次将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

答案 1 :(得分:2)

对于少数类别,一个简单的循环可能会很有效:

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

正则表达式解决方案也可能有效,但是在具有大量类别的情况下通常效率更高。

答案 2 :(得分:1)

尝试-

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

OR

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

您需要将function对象作为参数传递给apply函数

答案 3 :(得分:0)

还有另一个答案...

我一直在靠近您的代码,但是对功能做了些改动。

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)