2017-11-14 13 views
1

をチェックすることにより、データフレーム内の要素を変更:私は辞書を使用して、リスト内の要素を分類しようとしています辞書

mydict = {'beach': ['beach', 'sand', 'coast'], 'package': ['package', 'inclusive']} 

与えられたデータフレーム:

Keyword       |cat | 
--------------------------------|----| 
beach holiday     | | 
package beach holiday   | | 
inclusive beach holiday   | | 

私はそれかどうかを確認したいです要素が辞書にある場合は、キーワードをカテゴリ列に適用します。例:

Keyword       |cat | 
--------------------------------|----| 
beach holiday     |beach | 
package beach holiday   |package| 
inclusive package beach holiday |package| 

私はattを持っています次のコードで割り込む:しかし、これは単なる空のカテゴリリストを与える

df = get_csv(csv) 
mydict = {'beach': ['beach', 'sand', 'coast'], 'package': ['package', 'inclusive']} 

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   

答えて

1

あなたはキーで辞書にvaluesを入れ替えることができますが、それは、複数の値を返す:

mydict = {'beach': ['beach', 'sand', 'coast'], 'package': ['package', 'inclusive']} 
d = {k: oldk for oldk, oldv in mydict.items() for k in oldv} 
print (d) 
{'sand': 'beach', 'package': 'package', 'beach': 'beach', 
'inclusive': 'package', 'coast': 'beach'} 

find_keywords = lambda kw: [d[s] for s in kw.split() if s in d.keys()] 
df['cat_list'] = df['Keyword'].apply(lambda x: find_keywords(x)) 
print (df) 
        Keyword   cat_list 
0   beach holiday   [beach] 
1 package beach holiday [package, beach] 
2 inclusive beach holiday [package, beach] 

そしてのための新しい列:

df = df.join(pd.DataFrame(df['cat_list'].values.tolist(), columns=['cat1','cat2'])) 
print (df) 
        Keyword   cat_list  cat1 cat2 
0   beach holiday   [beach] beach None 
1 package beach holiday [package, beach] package beach 
2 inclusive beach holiday [package, beach] package beach 
関連する問題