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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

2363閲覧

python 時系列データを範囲ごとにグループ化したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/09/27 09:24

実現したいこと

時系列データを範囲ごとにグループ化('Group'カラムを追加)したい

使用データ

python

1import pandas as pd 2import io 3 4data = """ 5SaleDate,UserId 62017-01-01,47 72016-07-01,48 82017-02-01,49 92018-04-01,50 102019-05-06,51 11""" 12df = pd.read_csv(io.StringIO(data), parse_dates=['SaleDate']) 13df 14 15# SaleDate UserId 16#0 2017-01-01 47 17#1 2016-07-01 48 18#2 2017-02-01 49 19#3 2018-04-01 50 20#4 2019-05-06 51

希望データ

python

1# SaleDate UserId Group 2#0 2017-01-01 47 2 3#1 2016-07-01 48 1 4#2 2017-02-01 49 2 5#3 2018-04-01 50 4 6#4 2019-05-06 51 6

試したこと

python

1def conv_func(row): 2 3 if row['SaleDate'] >= dt.datetime(2016,7,1) and row['SaleDate'] <= dt.datetime(2016,12,1): 4 return 1 5 elif row['SaleDate'] >= dt.datetime(2017,1,1) and row['SaleDate'] <= dt.datetime(2017,6,1): 6 return 2 7 elif row['SaleDate'] >= dt.datetime(2017,7,1) and row['SaleDate'] <= dt.datetime(2017,12,1): 8 return 3 9 elif row['SaleDate'] >= dt.datetime(2018,1,1) and row['SaleDate'] <= dt.datetime(2018,6,1): 10 return 4 11 elif row['SaleDate'] >= dt.datetime(2018,7,1) and row['SaleDate'] <= dt.datetime(2018,12,1): 12 return 5 13 elif row['SaleDate'] >= dt.datetime(2019,1,1) and row['SaleDate'] <= dt.datetime(2019,6,1): 14 return 6 15 else: 16 raise RuntimeError(str(row)) 17 18df['Group'] = df.apply(lambda cols: conv_func[cols['UserId']], axis=1)

発生するエラー

TypeError: ("'function' object is not subscriptable", 'occurred at index 0')

→ 他にいい方法があれば、ご教授いただきたいです。
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

python

1df['Group'] = df.apply(lambda cols: conv_func(cols['UserId']), axis=1)

conv_funcは配列ではなくて関数なので、()を使うのがPython的に正しいです。

投稿2019/09/27 09:45

fukatani

総合スコア626

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

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

0

ベストアンサー

pandas.cut() を使うと良いと思います。

https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.cut.html

Python

1import pandas as pd 2import io 3 4data = """ 5SaleDate,UserId 62017-01-01,47 72016-07-01,48 82017-02-01,49 92018-04-01,50 102019-05-06,51 11""" 12df = pd.read_csv(io.StringIO(data), parse_dates=['SaleDate']) 13 14N = 8 15bins = pd.date_range('2016/6/1', freq='6M', periods=N).values 16df['Group'] = pd.cut(df['SaleDate'], bins, labels=list(range(1, N))) 17print(df) 18# SaleDate UserId Group 19#0 2017-01-01 47 2 20#1 2016-07-01 48 1 21#2 2017-02-01 49 2 22#3 2018-04-01 50 4 23#4 2019-05-06 51 6

投稿2019/09/27 09:44

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2019/10/07 07:04

magichan様 いつもご回答いただきありがとうございます。 私が試行錯誤していたものよりも、簡潔でわかりやすく大変参考となりました。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問