LoginSignup
0
2

More than 5 years have passed since last update.

pandas 購買データ(id x 商品) のデータフレームを辞書に変更する

Last updated at Posted at 2017-03-20

購買データを辞書に変更してみる。to_dict は使いません

to_dict だとうまくいかない感じだったので、自分でやってみました。
きっかけは、購買データを協調フィルタリングで処理したかったんですが、データフレームだと
うまくいきそうになかったのがきっかけ。
あと、集合知プログラミングにあるようなレコメンドロジックを試してみたいんだけど、
手元にはデータフレームのデータで、なんとか変換して利用したいと思いました。

# coding: utf-8

import pandas as pd
from collections import defaultdict

df = pd.DataFrame({'id':['a','a','b','b','c',], 'shouhin':['x', 'y', 'y','z', 'x']})

以下のようなデータがあったとします

  id shouhin
0  a       x
1  a       y
2  b       y
3  b       z
4  c       x

これを下のような辞書に変更するのが目的です。

{'a': ['y', 'x'], 'b': ['y', 'z'], 'c': ['x']}

まず、defaultdictで辞書を作っておきます。
そして、df.values で各行を取ってきて、要素をネストした辞書を作ります。
(df.values では numpy.array を返しています)

tempdic = defaultdict(dict)

for d in df.values:

    tempdic[d[0]][d[1]] = 1.0     # 値はなんでも良い

続いて、以下のようにすればOKです。

dic = {k: tempdic[k].keys() for k in tempdic}

dic を見ると、想定通りになっています
{'a': ['y', 'x'], 'c': ['x'], 'b': ['y', 'z']}

set を利用すれば共通の商品を取って来れますし、jaccard係数も計算しやすいです。

set(dic['a']) & set(dic['b'])
{'y'}

なお、最初の部分はdf.values にしなくても、ループさせてdf.iloc[行番号]で各行の要素を取得しても
可能ですが、その場合速度が格段に遅いです。
購買データの場合だとデータ量もそれなりに多いと思うので、ここが遅いと厳しいです。

また、whileやif を用いて一度にやる方法もあるかと思いますが、ここも速度優先で
そういった方法は用いないようにしています。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2