質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2145閲覧

異なるDataframeの結合(Merge)について

hiroikawa55

総合スコア26

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/02/02 15:08

編集2020/02/02 23:08

異なるDataframe同士の結合についてです。
Mergeを使う方法については、下記のページなどを参考にしました。
図解!Pandas DataFrameのmergeによる結合(JOIN)

やりたいこと:
① CSVの表を読み込み

namedatacompany
山田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'の値が変わってしまったからではないかと思い、チェックをしたのですが、差がみつけられず、日曜日が終わってしまいまして、こちらで質問をさせていただいた次第です。
申し訳ありませんが、どなたかご教授いただけますと、幸いに存じます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroikawa55

2020/02/02 23:09

ご依頼のありました、リンク先の表示方法を修正いたしました。
guest

回答1

0

ベストアンサー

df3['company']

Python

1"({:.2f}): {}".format(sim, "".join(tweet.split()))

にて書き出したデータを

Python

1list_df['company'].str.split(':', expand=True)

と分割したものなので、当然2つ目のデータ(company)には ({:.2f}): {}: の後のスペースが残ります。
(すべてのCompany列の頭にスペースが入っている状態になっている)

ですので修正点としては

Python

1df3['company'] = df3['company'].str.strip() 2print(pd.merge(df, df3, left_on='company', right_on='company'))

としてスペースを取り除く、もしくはデータ作成時に

Python

1tmp_se = pd.Series("({:.2f}):{}".format(sim, "".join(tweet.split())))

とスペースを入れないようにすると良いのではないでしょうか

投稿2020/02/03 00:29

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroikawa55

2020/02/03 03:45

できました・・。スペースが入っていたのですね・・・。orz コードが動いた時は、ようやく自分がやりたかったことができて、控えめに言っても感動しました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問