ここから本文です

python初心者です。 顧客Id,受注番号,受注日 というdataframeに対して、購入回...

tom********さん

2017/3/901:41:37

python初心者です。

顧客Id,受注番号,受注日
というdataframeに対して、購入回数というカラムを追加したいです。

購入回数のカラムに入る値は、
顧客ごとに、受注日の小さい順にソートし、最も受注日の古い順から、
1,2,3・・と増えるように値をセットしたいのですが、プログラムの書き方が
わかりません・・。

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

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

閲覧数:
222
回答数:
1

違反報告

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

mag********さん

2017/3/914:50:04

dataframe って事は Pandas に関する質問ですかね?

であれば、cumcount() を使うと良いと思います。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.g...


手順としては
1.DataFrame.sort_values() で'注文日'順にソート
2.DataFrame.groupby() にて '顧客ID'毎でグループ化
3.cumcount() で(グループ毎に)シーケンシャルな番号データを生成
4.pandas.concat()で上記の'購入回数'データと元の DataFrameを結合
となります。
なお、cumcount() は0からのデータを生成しますので1を足す必用があります

以下に、簡単ですがサンプルを書きます。

data.csv (サンプルデータ)
-----------------------------------------------------
顧客ID,受注番号,受注日
3,4,2016.9.1
3,7,2016.12.1
3,10,2017.3.1
1,5,2016.10.1
1,1,2016.6.1
1,2,2016.7.1
2,3,2016.8.1
2,8,2017.1.1
1,9,2017.2.1
2,6,2016.11.1
-----------------------------------------------------

sample.py (サンプルコード)
-----------------------------------------------------
import pandas as pd
# データ読み込み
df = pd.read_csv('data.csv', parse_dates=['受注日'], index_col='受注番号')
# '購入回数'データの作成
ser = df.sort_values(by='受注日').groupby('顧客ID').cumcount() + 1
ser.name = '購入回数'
# 元のデータに結合
df = pd.concat([df, ser], axis=1)
# 表示
print(df)
-----------------------------------------------------

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

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

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

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

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

閉じる

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

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

閉じる