Python 使用iterrows()修改数据帧中的元素

Python 使用iterrows()修改数据帧中的元素,python,pandas,Python,Pandas,我正在尝试更改大型数据帧中的一个元素 e、 g 我运行了一个方法find_keywords(关键字),它传入关键字,例如“inclusive package beach holiday”,与类别文本列表进行比较,并返回前三个相关类别 ''' Input a Keyword, breaks it down and finds which category it matches ''' def find_keywords(keywords): words = keywords.split() wo

我正在尝试更改大型数据帧中的一个元素

e、 g

我运行了一个方法find_keywords(关键字),它传入关键字,例如“inclusive package beach holiday”,与类别文本列表进行比较,并返回前三个相关类别

''' 
Input a Keyword, breaks it down and finds which category it matches
'''
def find_keywords(keywords):
words = keywords.split()
wordlist = []
for word in words:      
    if word in categories:
        wordlist.append(word)       
wordlist = wordlist [:3]    
return wordlist
在这种情况下:

['inclusive','package','beach']
这一切都很好,当我在数据上运行main方法时

if __name__ == '__main__':


df = get_csv(csv)


for index, row in df.iterrows():
    row['Keyword'].lower()
    print(row['Keyword'])
    tokens = find_keywords(row['Keyword'])
    print(tokens)
它返回:

beach holiday
['beach','holiday']                   
package beach holiday  
['package','beach','holiday']         
inclusive package beach holiday 
['inclusive','package','beach']
如何获取每个列表并将其添加到cat1/cat2/cat3列

生成数据帧:

Keyword                         |cat1   |cat2    |cat3   |
--------------------------------|----   |----    |----   |
beach holiday                   |beach  |holiday |       |
package beach holiday           |package|beach   |holiday|
inclusive package beach holiday |inclusive|package|beach |
使用@DaFanat的解决方案,我能够得到我想要的东西,但是我对此有一个轻微的排列,是否可以对照字典而不是列表进行检查

e、 g

然后将head术语应用于该类别,例如,如果它发现沙子,则会将其标记为海滩

我的尝试: 如果name='main':

df = get_csv(csv)
h = open('head_categories.txt','r')
mydict = h.read()
mydict = ast.literal_eval(mydict)




for key in mydict.keys():
    item = key
    if item in mydict[key]:
        target_cats = item
        find_keywords = lambda kw: [s for s in kw.split() if s in target_cats]

        df.loc[:, 'cat_list'] = df['Keyword'].apply(lambda x: find_keywords(x))
        for i in range(1, 4):
            df.loc[:, 'cat{0}'.format(i)] = df['cat_list'].apply(lambda x: x[i-1] if len(x) >= i else '')


print(df)
df.to_csv('kuoniTesting.csv')

我认为这可以做到:

target_cats = ['cat', 'dog', 'cow']
df = pd.DataFrame({'Keyword': ['cat dog cow', 'cat dog', 'dog sheep']})
find_keywords = lambda kw: [s for s in kw.split() if s in target_cats]

df.loc[:, 'cat_list'] = df['Keyword'].apply(lambda x: find_keywords(x))
for i in range(1, 4):
    df.loc[:, 'cat{0}'.format(i)] = df['cat_list'].apply(lambda x: x[i-1] if len(x) >= i else '')

     Keyword      cat_list         cat1 cat2 cat3
  0  cat dog cow  [cat, dog, cow]  cat  dog  cow
  1      cat dog       [cat, dog]  cat  dog     
  2    dog sheep            [dog]  dog          

如果我引用一个字典而不是一个列表,这还会起作用吗?对find_keywords函数和apply中的lambda函数几乎没有变化,是的。我尝试在外部添加一个for循环来引用字典的键,然后对照关键字中的标记检查键的术语。这是正确的方向吗?对不起,我忘了这个问题。请考虑提出一个新问题或重新编辑你原来的问题。考虑接受我的回答。
df = get_csv(csv)
h = open('head_categories.txt','r')
mydict = h.read()
mydict = ast.literal_eval(mydict)




for key in mydict.keys():
    item = key
    if item in mydict[key]:
        target_cats = item
        find_keywords = lambda kw: [s for s in kw.split() if s in target_cats]

        df.loc[:, 'cat_list'] = df['Keyword'].apply(lambda x: find_keywords(x))
        for i in range(1, 4):
            df.loc[:, 'cat{0}'.format(i)] = df['cat_list'].apply(lambda x: x[i-1] if len(x) >= i else '')


print(df)
df.to_csv('kuoniTesting.csv')
target_cats = ['cat', 'dog', 'cow']
df = pd.DataFrame({'Keyword': ['cat dog cow', 'cat dog', 'dog sheep']})
find_keywords = lambda kw: [s for s in kw.split() if s in target_cats]

df.loc[:, 'cat_list'] = df['Keyword'].apply(lambda x: find_keywords(x))
for i in range(1, 4):
    df.loc[:, 'cat{0}'.format(i)] = df['cat_list'].apply(lambda x: x[i-1] if len(x) >= i else '')

     Keyword      cat_list         cat1 cat2 cat3
  0  cat dog cow  [cat, dog, cow]  cat  dog  cow
  1      cat dog       [cat, dog]  cat  dog     
  2    dog sheep            [dog]  dog