我正在尝试使用字典和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
答案 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)