检查两个pandas数据帧中的子字符串

时间:2017-05-11 19:25:05

标签: python string pandas

我有两个数据帧,我使用函数str.contains来查看是否可以在另一个数据帧中找到列的值。

for i in range(len(ingName)):
    ingName[i]

#check if the string contains IngName ignoring uppercase, ignoring substrings


df_grocery[df_grocery['[SUB CATEGORY]'].str.contains(ingName[i], case=False)]
        df_grocery['IngredientName'] = ingName[i]
        df_grocery['IngredientID'] = ingID[i]

如果我指定行号,一切正常,但如果我尝试遍历ingName[i]中的所有名称,则会返回错误消息

"TypeError: first argument must be string or compiled pattern"

如果我这样做,它只返回数组中的最后一个元素?

df_grocery[df_grocery['[SUB CATEGORY]'].str.contains(ingName[i], case=False)]
df_grocery['IngredientName'] = ingName[i]
df_grocery['IngredientID'] = ingID[i]

这与我的csv文件的保存方式有什么关系,或者我是如何尝试实现此目的的?

控制台也打印出来

   246     if not sre_compile.isstring(pattern):
-->247         raise TypeError, "first argument must be string or compiled pattern"
    248     try:
    249         p = sre_compile.compile(pattern, flags)

谢谢,我们将不胜感激。

Hey @Tammy, let me try to explain what i am trying to achieve again
A   B
1  Rice
2  Choco

A                           B         
rice with no calries      22222
rice with calories        22222 
Milk                      22212


what i am trying to do is have

A                         B     c    d
rice with no calries      22222 1  Rice
rice with calories        22222 1  Rice

我可以使用我的第一个函数来实现这一点,但是当我尝试迭代第一个数据帧中的所有ID时会出现问题。

df_grocery = df_grocery[df_grocery['[SUB CATEGORY]'].str.contains(str(ingName[i]), case=False)]
df_grocery['IngredientName'] = ingName[i]
df_grocery['IngredientID'] = ingID[i]
df_grocery.to_csv("ingred.csv",  mode = 'a', encoding='utf-8', header=None)

这是有效的代码,必须将str添加到ingName,它可以工作,虽然目前只能写出List中的第一个元素。但这几乎可以满足我所需要的一切。

1 个答案:

答案 0 :(得分:0)

理想情况下,您可以使用以下内容:

for i in xrange(len(ingName)):
    print ingName[i]
    # checks the value of the current element in ingName is present in Sub category.
    indx = df_grocery[df_grocery['[SUB CATEGORY]'] == ingName[i]].index
    # for the rows returned update, the ingredient name and id
    for row in indx:
        df_grocery.loc[row,'IngredientName'] = ingName[i]
        df_grocery.loc[row,'IngredientID'] = ingID[i]
    else:
        print "Element missing"