異なるDataframe同士の結合についてです。
Mergeを使う方法については、下記のページなどを参考にしました。
図解!Pandas DataFrameのmergeによる結合(JOIN)
やりたいこと:
① CSVの表を読み込み
name | data | company |
---|---|---|
山田 | 10月1日 | ビープラ商事清水様来訪 |
鈴木 | 10月2日 | ガイア不動産高橋様来訪 |
佐藤 | 10月8日 | ABC案件進捗確認会議 |
清水 | 10月14日 | マックス保険太田様来訪(高橋同席) |
高橋 | 10月24日 | マックス保険進捗会議 |
山田 | 10月25日 | ギャラクシー物産訪問事前打ち合わせ(小泉部長) |
鈴木 | 10月30日 | ガイア不動産案件進捗会議 |
② 読み込んだ表の、特定のカラム('company')を抽出し、inputで入力した内容(例えば'不動産')に類似する値と、その一致率をカラムにした新たなDataframeをつくる
python
1from sklearn.feature_extraction.text import CountVectorizer 2from sklearn.feature_extraction.text import TfidfTransformer 3from sklearn.metrics.pairwise import cosine_similarity 4from janome.tokenizer import Tokenizer 5import MeCab 6import numpy as np 7from sklearn.metrics.pairwise import cosine_similarity 8 9docs=df['company'].to_string(index=False) 10docs = str(docs) 11docs = docs.splitlines() 12tagger = MeCab.Tagger('-Owakati') 13docs = [tagger.parse(sentence).strip() for sentence in docs] 14 15vectorizer = CountVectorizer(token_pattern=u'(?u)\b\w+\b') 16transformer = TfidfTransformer() 17 18tf = vectorizer.fit_transform(docs) 19tfidf = transformer.fit_transform(tf) 20 21v = input()# '不動産'などの言葉を入力 22 23sample = str(v) 24sample_tf = vectorizer.transform([tagger.parse(sample).strip()]) 25sample_tfidf = transformer.transform(sample_tf) 26similarity = cosine_similarity(sample_tfidf, tfidf)[0] 27topn_indices = np.argsort(similarity)[::-1][:30] 28list_df = pd.DataFrame() 29for sim, tweet in zip(similarity[topn_indices], np.array(docs)[topn_indices]): 30 tmp_se = pd.Series("({:.2f}): {}".format(sim, "".join(tweet.split()))) 31 list_df = list_df.append(tmp_se, ignore_index=True ) 32list_df.rename(columns={0: 'company'}, inplace=True) 33df2=list_df['company'].str.split(':', expand=True) 34df2.head() 35df3=df2.rename(columns={0: '一致率',1: 'company'}, inplace=False) 36df3.head()
一致率 | company |
---|---|
(0.50) | ガイア不動産高橋様来訪 |
(0.47) | ガイア不動産案件進捗会議 |
(0.00) | マックス保険進捗会議 |
(0.00) | ABC案件進捗確認会議 |
③最初にCSVで読み込んだデータフレームを、companyのカラムをkeyにして結合する
python
1print(pd.merge(df, df3, left_on='company', right_on='company'))
すると、Empty DataFrame Columns: [name, date, company, 一致率] Index: []
と出てきてしまいます。
下記のような結果を期待していたのですが・・・
|一致率|company|name|data
|:--|:--:
|(0.50)|ガイア不動産高橋様来訪|鈴木|10月2日
|(0.47)|ガイア不動産案件進捗会議|鈴木|10月30日
|(0.00)|マックス保険進捗会議|高橋|10月24日
|(0.00)|ABC案件進捗確認会議|佐藤|10月8日
途中の分かち書きで、'company'の値が変わってしまったからではないかと思い、チェックをしたのですが、差がみつけられず、日曜日が終わってしまいまして、こちらで質問をさせていただいた次第です。
申し訳ありませんが、どなたかご教授いただけますと、幸いに存じます。
回答1件
あなたの回答
tips
プレビュー