Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

購買データを辞書に変更してみる。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 を用いて一度にやる方法もあるかと思いますが、ここも速度優先で
そういった方法は用いないようにしています。

haru1977
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away