我在大熊猫中有一种情况。我有一个Excel文件,其中有一个名为item
的列,其中包含一些文本。我有另一个数据框,其中有一列称为brand
。如果项目列文本中存在品牌字符串,我想在项目列前面添加品牌名称。
这是我的excel文件快照。
我的品牌数据框如下所示。
brand_df = pd.DataFrame({'brand':['spark','hadoop','hive']})
我想检查brand_df
中是否存在item_df
品牌。如果存在品牌,则它应位于商品前面的update_column
名称下方,如下所示。
根据pandas文档,我们应该了解实现此目标的地图,但是我的map函数如下所示。
self.item_df['updated_column'] = self.item_df["item"].map(lambda x : 'spark' if 'spark' in x else 'hive' if 'hive' in x else 'hadoop' if 'hadoop' in x else '' )
在上述命令中,问题是当您的品牌列表很长时,将很难工作。
有人能建议我解决这个问题的最佳方法吗?
Excel内容的文本版本
item
hadoop is fast
hive is sql on hdfs
spark is superfast
spark is awesome
AWS is emr function
答案 0 :(得分:0)
使用带有Series.str.extract
的单词边界来获取第一个匹配值:
pat = '|'.join(r"\b{}\b".format(x) for x in brand_df['item'])
#if dont need words boundaries
#pat = '|'.join(brand_df['item'])
item_df['updated_column'] = item_df['item'].str.extract('('+ pat + ')', expand=False)
或者如果需要所有匹配的值,请使用Series.str.findall
和Series.str.join
:
item_df['updated_column'] = item_df['item'].str.findall(pat).str.join(',')
答案 1 :(得分:0)
为什么没有pd.Series.str.findall
和str.join
:
df['update_column'] = df['item'].str.findall('|'.join(brand_df['brand'])).str[0]