【问题标题】:Pandas : Filter Data from one dataframe column and update another df columnPandas:从一个数据框列中过滤数据并更新另一个 df 列
【发布时间】:2019-07-09 17:41:24
【问题描述】:

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

这是我的 excel 文件快照。

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

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

我想检查brand_df 品牌是否存在于item_df 中。如果品牌存在,那么它应该在项目前面的update_column 名称下,如下所示。

根据 pandas doc 的理解,我们应该使用地图来实现这一点,但我的地图功能如下所示。

 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 

【问题讨论】:

  • 请提供可复制的文本而不是图像。

标签: python pandas dataframe


【解决方案1】:

使用带有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(',')

【讨论】:

    【解决方案2】:

    为什么不pd.Series.str.findallstr.join

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 2021-08-16
      • 2021-09-09
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多