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

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

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

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

Q&A

解決済

2回答

443閲覧

重複データを削除後、処理し、再度元のデータと照らし合わせたい

Cherry

総合スコア4

Python

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

0グッド

0クリップ

投稿2023/01/08 16:30

前提

商品の購入データを扱っています。
返品に関する分析を行っています。

実現したいこと

商品の購入データから顧客ごとの総購入回数と総返品回数を算出。

総返品回数÷総購入回数=返品率を顧客ごとに算出 (←ここまでは完了)

返品率が高い顧客のみを抽出し、彼らの購入でーたや返品データを今後分析していきたい。

発生している問題・エラーメッセージ

返品処理も含めた全取引データセット(以下に例を作成)を用いると、取引単位で記録されているため、同じ顧客番号の取引がいくつも存在する。
そこで、顧客ごとの返品率を出すために顧客番号と返品回数総取引数の列を抽出し、被りを削除することで、顧客ごとの新たなデータセットを作成した。(新たなデータセット)
その後、この新しいデータセットを用いて返品率を求め、返品率50%以上の人を対象にしていこうと思いました。

前提が長くなってしまって、わかりづらい説明でごめんなさい。。
本題の今発生している問題なのですが、新たなデータセットを用いて対象の顧客を絞ることができたのはいいものの、その顧客データと合致する取引をもとの全取引のデータから抽出したいのです。

     全取引データセット (df5)                                
顧客番号 商品名 ・・・ 返品回数 総取引数
143  ○○○      3    24
265  ○○○      1    13
375  ○○○      14   102
265  ○○○      1    13

・・・

189  ○○○      5    58
721  ○○○      5    49
375  ○○○      14   102
932  ○○○      9    154

  新たなデータセット (df6)
顧客番号 返品回数 総取引数
143  3    24
265  1    13
375  14   102

・・・

189  5    58
721  5    49
932  9    154

SyntaxError: invalid syntax

該当のソースコード

#元のデータセットから顧客番号、返品回数、総取引数のみ抽出 df6=df5[['mbr_no','Return_num','sales_num']] #被っている列を削除←顧客番号の被りがなくなる df6.drop_duplicates() #返品率を計算 df7=df6.assign(return_ratio = df6["Return_num"]/df6["sales_num"]) #返品率50%以上のデータを抽出 df8=df7[df7['return_ratio']>=0.500] #上の顧客番号と一致する顧客番号のデータをもとのデータセットdf5から抽出する(エラー発生) df5[df5['mbr_no']==df8['mbr_no']] 

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

melian

2023/01/08 16:46

コメント開始文字(#)が # (FULLWIDTH NUMBER SIGN)になっている行があることと、 df5[df5['mbr_no']==df8['mbr_no']]  の行末に " "(全角スペース)が入っています。質問文にコードを貼り付ける際のミスでしょうか?
pig_vba

2023/01/08 23:57 編集

エラー自体とは関係ない部分ですが… df6.drop_duplicates()はデフォルトでは重複結果を返り値として返すだけなので元のdf6そのものは変化しません。 ↓ df6.drop_duplicates(inplace=True)とするか、 df6=df6.drop_duplicates() とする必要があります。 https://note.nkmk.me/python-pandas-duplicated-drop-duplicates/ の引数inplace項目が参考になると思います。
guest

回答2

0

顧客データと合致する取引をもとの全取引のデータから抽出したい

python

1import pandas as pd 2import io 3 4csv_data = ''' 5mbr_no,goods_name,Return_num,sales_num 6143,○○○,3,24 7265,○○○,1,13 8375,○○○,14,102 9265,○○○,1,13 10189,○○○,5,58 11721,○○○,5,49 12375,○○○,14,102 13932,○○○,9,154 141024,○○○,10,15 15''' 16df = pd.read_csv(io.StringIO(csv_data)) 17 18# 19cols = ['mbr_no', 'Return_num', 'sales_num'] 20dfx = df.drop_duplicates(subset=cols).query('Return_num/sales_num >= 0.5') 21print(dfx) 22 23# mbr_no goods_name Return_num sales_num 24# 8 1024 ○○○ 10 15

投稿2023/01/09 03:16

編集2023/01/09 03:25
melian

総合スコア19703

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

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

0

ベストアンサー

==ではなくisinで抽出することができます。

Python

1import pandas as pd 2 3df5 = pd.DataFrame({'mbr_no':range(10), 'product_name':[f'p{i}' for i in range(10)]}) 4df8 = pd.DataFrame({'mbr_no':[3,5]}) 5 6df = df5[df5['mbr_no'].isin(df8['mbr_no'])] 7print(df) 8# mbr_no product_name 9#3 3 p3 10#5 5 p5

投稿2023/01/08 23:55

can110

総合スコア38256

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

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

Cherry

2023/01/09 14:02

非常にシンプルでわかりやすいアンサーをありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問