我有一个标识符函数,它遍历DataFrame列中的所有元素,然后为它们分配一个类别。我现在的代码现在看起来像这样;
def fruit_replace(x):
fruit_quantity = re.search(r'(\\d+)quantity', x)
if 'apple' in x:
return 'green'
elif 'pear' in x:
return 'green'
elif 'cherry' in x:
return 'red'
elif 'banana' in x:
return 'yellow'
elif fruit_quantity != None:
return fruit_quantity.group(0)
我在DataFrame上的lambda函数中应用它,并将结果分配给新列。不幸的是,由于fruit_quantity
搜索与其他搜索不同,它有点复杂。
这个过程应该产生这样的东西;
原始DataFrame
pd.DataFrame({'fruit_type': ['big apple', 'small cherry', 'jerry 10quantity']})
进入这个
pd.DataFrame({'fruit_type': ['big apple', 'small cherry', 'peach 10quantity'],
'category': ['green', 'red', 10]})
我的问题是,这个代码是否可以用pythonic或pandas方式改进,并且可能是矢量化的?我必须将其应用于大约500万行,这需要一些时间。
非常感谢!
答案 0 :(得分:1)
您可以将boolean indexing与str.contains()方法结合使用:
df['category'] = np.nan
df.loc[df.fruit_type.str.contains(r'\b(?:apple|pear)\b'), 'category'] = 'green'
df.loc[df.fruit_type.str.contains(r'\b(?:cherry)\b'), 'category'] = 'red'
df.loc[df.fruit_type.str.contains(r'\b(?:banana)\b'), 'category'] = 'yellow'
df.loc[df['category'].isnull() & (df.fruit_type.str.contains(r'\d+q')), 'category'] = \
df.fruit_type.str.extract(r'(\d+)q', expand=False)
结果:
In [270]: df
Out[270]:
fruit_type category
0 big apple green
1 small cherry red
2 jerry 10quantity 10