【问题标题】:Singular and plural phrase matching in pandaspandas 中的单复数短语匹配
【发布时间】:2015-11-23 05:32:49
【问题描述】:

我有一个pandas系列,另外一句Dataframe如下(这里只添加数据的摘要)。

#df
0  1 teaspoon vanilla extract
1  2 eggs
2  1 cup chopped walnuts
3  1 cup rolled oats

和

#ingredients

0   vanilla
1   walnut
2   oat
3   egg

我正在应用以下函数来检查#ingredients 中的成分是否在#df 字段中可用。

masked = map(lambda x: any(ingredients.apply(str.lower).isin(x)),            
             df[0].apply(str.lower).apply(str.split))
df['Ingredient Available'] = masked

问题是当成分的复数形式存在于例如:eggs 掩码字段返回false(甚至认为egg 在#ingredient 列表中)。谁能在不考虑单数还是复数的情况下向我建议一种方法来完成这项工作? (我遵循pandas find strings in common among Series 中建议的路径,请不要将此标记为重复,因为该问题未提及此类问题)。

非常感谢

【问题讨论】:

  • 那么 2 个 dfs 的长度是否相同?看起来成分只是一个大查找表,对吗?
  • 是的,它有 381 种成分。
  • 我想我想寻找一种方法来寻找这样的东西。 egg in eggs 因为它返回 true。我的想法不清楚是谁将其添加到函数中
  • 您可以看看合并TextBlob 库。它支持变形变化(singularize() 和 pluralize())。这将捕获与单数等价物不同的复数形式(例如 goose 和 geese)。

标签: python string pandas


【解决方案1】:

我不知道您的第一个 df 的列名是什么,在我的示例中它们都是成分,但以下方法可行:

In [256]:
df1['ingredients'].apply(lambda x: any(df['ingredients'].str.lower().str.contains(x.lower())))

Out[256]:
index
0    True
1    True
2    True
3    True
Name: ingredients, dtype: bool

基本上这执行反向查找,我们使用apply 迭代成分系列,然后使用contains 在整个df 中测试该成分的成员资格,这将在这种情况下处理复数。

【讨论】:

  • 第一个 df 没有列名,所以我只是使用 df[0] 并仅使用成分作为下一个(它是一个系列)。但结果不像你说的那样。一切都是假的masked=df[0].apply(lambda x: any(ingredients.str.lower().str.contains(x.lower())))
  • 不,你需要反过来做:ingredients.apply(lambda x: any(df[0].str.lower().str.contains(x.lower()))) –
  • 不走运。一切似乎都返回 False
  • 那么您将不得不发布实际的原始数据和代码来重现您的错误,在您的示例上您已经发布了我的代码作品
  • 我想我找到了问题所在。我只提到很少的#ingredients 中有 381 个变量。我在此处集成您的代码时提供了示例代码。 ingredients=pd.Series(["vanilla extract","walnut","oat","egg"]) df=pd.DataFrame(["1 teaspoon vanilla extract","2 eggs","1 cup chopped walnuts","1 cup rolled oats","nnnnfgsdfg","asffadsf"]) 然后我应用了你的功能。 ingredients.apply(lambda x: any(df[0].str.lower().str.contains(x.lower()))) 结果为前 4 种成分提供了 true 并且没有为最后两种 "nnnnfgsdfg","asffadsf" 返回 false
猜你喜欢
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2017-04-02
  • 2017-04-14
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多