熊猫:从一个数据框列过滤数据并更新另一个df列

时间:2019-07-09 08:33:41

标签: python pandas dataframe

我在大熊猫中有一种情况。我有一个Excel文件,其中有一个名为item的列,其中包含一些文本。我有另一个数据框,其中有一列称为brand。如果项目列文本中存在品牌字符串,我想在项目列前面添加品牌名称。

这是我的excel文件快照。

enter image description here

我的品牌数据框如下所示。

brand_df =  pd.DataFrame({'brand':['spark','hadoop','hive']})

我想检查brand_df中是否存在item_df品牌。如果存在品牌,则它应位于商品前面的update_column名称下方,如下所示。 enter image description here

根据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 

2 个答案:

答案 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.findallSeries.str.join

item_df['updated_column'] = item_df['item'].str.findall(pat).str.join(',')

答案 1 :(得分:0)

为什么没有pd.Series.str.findallstr.join

df['update_column'] = df['item'].str.findall('|'.join(brand_df['brand'])).str[0]