ここから本文です

python初心者です。

tom********さん

2017/3/922:13:05

python初心者です。

顧客Id,受注番号,受注日
A,1,2012.1.1
A,2,2012.2.1
A,3,2012.3.1
B,4,2012.4.6
B,5,2012.6.1
B,6,2012.8.15
C,7,2012.5.2
C,8,2012.10.9
C,9,2012.11.18
というdataframeがあるとして・・・

顧客ごとに、最も受注日の古い日から起算して90日以内のデータを抽出したいです。

つまり、
顧客A 受注日が2012.1.1から90日以内のレコード
顧客B 受注日が2012.4.6から90日以内のレコード
顧客C 受注日が2012.5.2から90日以内のレコード
を抽出したいので、成功したら下記のような結果であってほしいです。

顧客Id,受注番号,受注日
A,1,2012.1.1
A,2,2012.2.1
A,3,2012.3.1
B,4,2012.4.6
B,5,2012.6.1
C,7,2012.5.2

Mysqlなら書けるのですが・・・Python初心者のためどこから手を付けて良いやらわかりません・・。

どのように書いたら良いでしょうか。
教えてください。

宜しくお願いいたします。

閲覧数:
63
回答数:
2

違反報告

ベストアンサーに選ばれた回答

mag********さん

2017/3/1017:07:47

何度も書きますが、Pythonというより pandas の質問ですよね?

とりあえずであれば、こんな感じで出来ます。
もっと少しスマートな手法があると思いますが・・


data.csv
-------------------------------
顧客Id,受注番号,受注日
A,1,2012.1.1
A,2,2012.2.1
A,3,2012.3.1
B,4,2012.4.6
B,5,2012.6.1
B,6,2012.8.15
C,7,2012.5.2
C,8,2012.10.9
C,9,2012.11.18
-------------------------------

sample.py
-------------------------------
import pandas as pd
df = pd.read_csv('data.csv', index_col='受注番号', parse_dates=['受注日'])
period = df.groupby('顧客Id')['受注日'].min() + pd.DateOffset(days=90)
ret = df[df.apply(lambda d: d['受注日'] < period[d['顧客Id']], axis=1)]
print(ret)
-------------------------------


特に問題ないと思いますが、簡単に説明を。

1.dataframe.groupby() にて各"顧客Id"毎に受注日を取得して、最小値(始点)を求める
2.その値に 90日を足して期限データを求める。
3.dataframe.apply(axis=1) で各Rowデータに対して条件文(期限内か?)を適用して Boolean配列 を求める。
4.上記のBoolean配列にて元のdataframeをスライスする

となります。


>> Mysqlなら書けるのですが・・・

とりあえずこの辺を眺めてみてはいかがでしょうか。
http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.htm...

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

prwssさん

2017/3/1009:59:40

>どこから手を付けて良いやら

まずはリスト操作から学びます

こういう簡単なさんすうのドリルみたいなものを50問ほど繰り返すと書けるようになる……と、言われています


関数型プログラミング HOWTO — Python 3.6.0 ドキュメント
https://docs.python.jp/3/howto/functional.html


map, reduce, filterによるシーケンス操作 | Python Snippets
http://python.civic-apps.com/map-reduce-filter/

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる