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

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

新規登録して質問してみよう
ただいま回答率
85.48%
GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

Q&A

解決済

1回答

1439閲覧

Pythonを使ってID-POSデータを会員ID×購入順(1回目・2回目・・・n回目)のデータに加工する方法

takec

総合スコア17

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

0グッド

1クリップ

投稿2019/09/01 14:28

編集2019/09/02 07:37

以下のようなID-POSデータを、会員ID別かつ購入順(1回目・2回目・・・n回目)にどのアイテムを購入したかが分かるようなデータに変換したく、その方法についてご教示いただけませんでしょうか。
ツールはpythonを想定しております。
以下にイメージを記載いたします。

【元のデータ】
|会員ID|伝票番号|購入日時|購入アイテム|
|:--:|--:|
|100|1|9/1 9:00|靴|
|101|2|9/2 19:00|Tシャツ|
|101|2|9/2 19:00|帽子|
|102|3|9/3 10:00|Tシャツ|
|100|4|9/3 14:00|傘|
|103|5|9/4 15:00|文房具|
|102|6|9/5 18:00|靴下|
|103|7|9/6 17:00|帽子|
|100|8|9/7 10:00|灰皿|
|101|8|9/7 16:00|靴|


【加工後のデータ】
|会員ID|購入回数|購入アイテム1|購入アイテム2|
|:--:|--:|
|100|1回目|靴||
||2回目|傘||
||3回目|灰皿||
|101|1回目|Tシャツ|帽子||
||2回目|靴|||
|102|1回目|Tシャツ||
||2回目|靴下||
|103|1回目|文房具||
||2回目|帽子||

*会員IDごとに何回目の購入でどのアイテムを購入したか確認できるようなローデータに変換したいと思っております
*同時購買がある場合は、~~縦に会員IDを展開させたいと思っております(ex.上記、会員ID:101)~~上記会員ID:101のように、該当の”回数”時点についてアイテム1・アイテム2・・・のように横に変数を展開したいと思っております

お忙しいところ恐れ入りますが、ご教示いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

t_obara

2019/09/01 23:34

具体的にどのような点がわからないのでしょうか。
magichan

2019/09/02 03:08

「同時購買がある場合は、縦に会員IDを展開させたいと思っております」の仕様なのですが、例えば1回目に4種類、2回目に4種類、3回目にも4種類の商品を購入したとすると64行に展開することになりますが本当にこの仕様で良いのでしょうか??
tiitoi

2019/09/02 06:13 編集

整形したあとデータ分析することを考えると、質問のように Data Frame を整形するより、元の DataFrame に列「購入回数」を1つ追加したほうがよいと思います。
takec

2019/09/02 07:14

>t_obara様 最初、groupbyで会員ID×伝票番号のカテゴリ別集計をすれば、会員ごとに何回目の購入で何を購入したか確認できると考えました。ただしこの場合、「購入アイテム」がカテゴリー変数のため、groupbyの集計前にoneHot encodingが必要なのか、もしくは他に効率の良い方法があるのか分からなく、ご質問させていただいた次第です。
takec

2019/09/02 07:38 編集

>magichan様 ご指摘の通りですね。。購入回数の列を作り、購入アイテムをoneHot encodingで1,0のデータにすることで、何回目の購入で何を(同時に)購入したか、を確認できる仕様が良さそうに思いました。この集計をするにはgroupbyで会員ID×伝票番号の集計をする必要があるように思いますが、会員IDごとの購入回数の列をどのようにすれば付与できるのか分からなく、申し訳ありませんがご教示いただけますと幸いです。
takec

2019/09/02 07:40

>tiitoi様 ご教示いただきありがとうございます。購入回数の付与は会員ID×伝票番号ごとに連続値(1,2,3,4...)を付与したいと思っておりますが、groupbyで会員ID×伝票番号の集計をした後にそのような連続値を付与できるのでしょうか。
takec

2019/09/02 14:15

>t_obara様 ご返信いただきありがとうございます。こちらのサイトで連続値を付与することができました。共有いただきありがとうございます。
guest

回答1

0

ベストアンサー

もう少しスマートに書けそうな気がしますが、とりあえず。

Python

1import pandas as pd 2import io 3 4data = """ 5会員ID,伝票番号,購入日時,購入アイテム 6100,1,9/1 9:00,靴 7101,2,9/2 19:00,Tシャツ 8101,2,9/2 19:00,帽子 9102,3,9/3 10:00,Tシャツ 10100,4,9/3 14:00,傘 11103,5,9/4 15:00,文房具 12102,6,9/5 18:00,靴下 13103,7,9/6 17:00,帽子 14100,8,9/7 10:00,灰皿 15101,8,9/7 16:00,靴 16""" 17 18df = pd.read_csv(io.StringIO(data), parse_dates=['購入日時']) 19 20def f(data): 21 data = data.sort_values('伝票番号') 22 ret = data.groupby('伝票番号')[['購入アイテム']].apply(lambda d: d.reset_index(drop=True)).unstack() 23 ret = ret.reset_index(drop=True) 24 ret.index = ret.index +1 25 return ret 26 27result = df.groupby('会員ID').apply(f) 28# 購入アイテム 29# 0 1 30#会員ID 31#100 1 靴 NaN 32# 2 傘 NaN 33# 3 灰皿 NaN 34#101 1 Tシャツ 帽子 35# 2 靴 NaN 36#102 1 Tシャツ NaN 37# 2 靴下 NaN 38#103 1 文房具 NaN 39# 2 帽子 NaN

【追記】
コメントの修正を行うには、上記のコードを以下のように修正するとよいかとおもいます。
多分。。

diff

1--- test02.py 2019-09-02 17:31:55.242972400 +0900 2+++ test02b,py 2019-09-03 08:29:33.394626200 +0900 3@@ -23,7 +23,8 @@ 4 ret = data.groupby('伝票番号')[['購入アイテム']].apply(lambda d: d.reset_index(drop=True)).unstack() 5 ret = ret.reset_index(drop=True) 6 ret.index = ret.index +1 7- return ret 8+ ret.columns = ret.columns.droplevel(0) 9+ return ret.T 10 11 result = df.groupby('会員ID').apply(f) 12 print(result)

投稿2019/09/02 08:36

編集2019/09/02 23:32
magichan

総合スコア15898

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

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

takec

2019/09/02 14:32

ありがとうございます、こちらのコードでデータを作成することができました。大変助かりました。 また、重ねての質問にて大変恐縮なのですが、ここからさらに全会員IDの1回目のデータに絞り、変数”購入アイテム"の0,1,2...を縦持ちに変換する(以降2回目データ、3回目データ..も同様に繰り返す)ことは可能でしょうか。 最終的に作りたいデータは以下のような形で、購入順序を加味したバスケット分析ができる形に整形したいと考えております。 この際の同時購買の扱いについて悩みましたが、一度共有いただいたような形で作成した後、会員IDが重複する形で縦持ちに整形する→各購入回数別のデータをマージする、という流れを想定でおりました。 # 購入アイテム(1回目,2回目,3回目) #会員ID #100 靴,傘,灰皿 #101 Tシャツ, 靴 #101 帽子,靴 #ID101は同時購買があるため縦に展開 #102 Tシャツ,靴下 #103 文房具,帽子 Python初心者のため言葉足らずな部分が多々あるかと存じますが、お手すきの際にご教示いただけますと幸いです。どうぞ宜しくお願いいたします。
magichan

2019/09/02 23:33

f の戻り値を転地するとよいだけです。 一応、回答に追記しておきました。
takec

2019/09/03 10:10

ご丁寧に追記くださりありがとうございます。 お送りいただいたコードで希望通りのデータを作成できました! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問