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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

601閲覧

Pandasのapply機能

J1N

総合スコア56

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/02/08 14:36

編集2019/02/08 16:24

前提・実現したいこと

自分で定義した関数をapplyを用いてpandasuに適用する

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

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-231-f829a566d8dd> in <module> 5 dataset = pd.get_dummies(data = dataset, columns = ["short_ma_order"]) 6 ----> 7 dataset["direction_of_3"] = dataset.apply(direction_of_3) 8 9 dataset.tail() ~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in apply(self, func, axis, broadcast, raw, reduce, result_type, args, **kwds) 6012 args=args, 6013 kwds=kwds) -> 6014 return op.get_result() 6015 6016 def applymap(self, func): ~/anaconda3/lib/python3.6/site-packages/pandas/core/apply.py in get_result(self) 314 if isinstance(self.f, (list, dict)): 315 return self.obj.aggregate(self.f, axis=self.axis, --> 316 *self.args, **self.kwds) 317 318 return super(FrameRowApply, self).get_result() ~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in aggregate(self, func, axis, *args, **kwargs) 5826 if axis == 0: 5827 try: -> 5828 result, how = self._aggregate(func, axis=0, *args, **kwargs) 5829 except TypeError: 5830 pass ~/anaconda3/lib/python3.6/site-packages/pandas/core/base.py in _aggregate(self, arg, *args, **kwargs) 549 return self._aggregate_multiple_funcs(arg, 550 _level=_level, --> 551 _axis=_axis), None 552 else: 553 result = None ~/anaconda3/lib/python3.6/site-packages/pandas/core/base.py in _aggregate_multiple_funcs(self, arg, _level, _axis) 607 # if we are empty 608 if not len(results): --> 609 raise ValueError("no results") 610 611 try: ValueError: no results

該当のソースコード

Python3

1def direction_of_3(column): 2 direction_of_3 = [] 3 idx = list(column.index) 4 for i in idx: 5 dif_1 = column["3SMA"].diff()[i] 6 7 if dif_1 > 0: 8 direction = 1 9 else: 10 direction = 0 11 direction_of_3.append(direction) 12 return direction_of_3 13 14dataset["direction_of_3"] = dataset.apply(direction_of_3)

元データ

|Date|Open|High|Low|Close|Adj Close|Volume|3SMA|5SMA|7SMA|
|:--|:--:|--:|
|1980-01-04|6560.160156|6560.160156|6560.160156|6560.160156|6560.160156|0|NaN|NaN|NaN|
|1980-01-07|6552.649902|6552.649902|6552.649902|6552.649902|6552.649902|0|NaN|NaN|NaN|
|1980-01-08|6563.279785|6563.279785|6563.279785|6563.279785|6563.279785|0|6558.696614|NaN|NaN|
|1980-01-09|6591.830078|6591.830078|6591.830078|6591.830078|6591.830078|0|6569.253255| NaN|NaN|
|1980-01-10|6594.009766|6594.009766|6594.009766|6594.009766|6594.009766|0.0|6583.039876 |6572.385937|NaN|
|1980-01-11|6615.509766|6615.509766|6615.509766|6615.509766|6615.509766 |0.0|6600.449870|6583.455859|NaN|
|1980-01-14|6659.549805|6659.549805|6659.549805|6659.549805|6659.549805|0.0|6623.023112|6604.835840|6590.998465|
|1980-01-16|6653.259766|6653.259766|6653.259766|6653.259766|6653.259766|0.0|6642.773112|6622.831836|6604.298410|
|1980-01-17|6656.299805|6656.299805|6656.299805|6656.299805|6656.299805|0.0|6656.369792|6635.725782|6619.105539|
|1980-01-18|6649.299805|6649.299805|6649.299805|6649.299805|6649.299805|0.0|6652.953125|6646.783789|6631.394113|
|1980-01-21|6666.270020|666.270020|6666.270020|6666.270020|6666.270020|0.0|6657.289877|6656.935840 |6642.028390|
|1980-01-22|6684.589844|6684.589844|6684.589844|6684.589844|6684.589844|0.0|6666.719890|6661.943848|6654.968402|
|1980-01-23|6694.189941|6694.189941|6694.189941|6694.189941|6694.189941|0.0|6681.683268|6670.129883|6666.208427|
|1980-01-24|6746.930176|6746.930176|6746.930176|6746.930176|6746.930176|0.0|6708.569987|6688.255957|6678.691337|
|1980-01-25|6767.709961|6767.709961|6767.709961|6767.709961|6767.709961|0.0|6736.276693|6711.937988|6695.041365|
|1980-01-28|6763.609863|6763.609863|6763.609863|6763.609863|6763.609863|0.0|6759.416667|6731.405957|6710.371373|
|1980-01-29|6770.830078|6770.830078|6770.830078|6770.830078|6770.830078|0.0|6767.383301|6748.654004|6727.732840|
|1980-01-30|6776.600098|6776.600098|6776.600098|6776.600098|6776.600098|0.0|6770.346680|6765.136035|6743.494280|
|1980-01-31|6768.160156|6768.160156|6768.160156|6768.160156|6768.160156|0.0|6771.863444|6769.382031|6755.432896|
|1980-02-01|6777.640137|6777.640137|6777.640137|6777.640137|6777.640137|0.0|6774.133464|6771.368066|6767.354353|

試したこと

同じ内容を実行するために、以下のコードを試したところ、成功しました。

Python3

1idx = list(dataset["3SMA"].index) 2direction_of_3 = [] 3for i in idx: 4 dif_1 = dataset["3SMA"].diff()[i] 5 if dif_1 > 0: 6 direction = 1 7 else: 8 direction = 0 9 direction_of_3.append(direction) 10 11dataset["direction_of_3"] = direction_of_3

しかし、コードに書いた通り、先に関数として定義しておき、その後にapplyを用いて適用しようとすると、エラーが起きてしまいます。
今回のコードがうまくいかない原因と、applyをうまくいくようにするための方法、またapplyの正しい使い方について、教えていただけますと幸いです。

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

Jupiter notebook を使用しています。

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

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

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

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

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

tiitoi

2019/02/08 15:13

質問欄に読み込んだ元データを追記できますか?
J1N

2019/02/08 15:25

ご覧いただき、ありがとうございます。 元データの画像を質問に追加しました。 まだ初心者のため、pandasで編集を加えた別ファイルとして保存する方法とそれをこのサイトにアップする方法を知らない状況です。 元データをアップする手順をもし教えていただけましたら、取り掛かってみます。 大変お手数をおかけしますが、よろしくお願いいたします。
J1N

2019/02/08 16:25 編集

最初の20行を抜粋して記載してみました。 いかがでしょうか?
guest

回答1

0

ベストアンサー

DataFrame.apply() 関数は axis で指定した方向の各行 (列) ごとに関数を呼び出して変換が行われます。
関数の引数はこの場合、Series になります。

python

1df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c']) 2df
abc
1123
2456

axis=0 の場合、列ごとに適用 (デフォルト)

python

1def func(x): 2 return x - x.max() 3 4df.apply(func, axis=0)
abc
1-40-2
2-60-2

axis=1 の場合、行ごとに適用

python

1def func(x): 2 return x - x.max() 3 4df.apply(func, axis=1)
abc
1-1-3-3
2000

なので、DataFrame.apply() の結果をある列に入れてる以下のコードは
Series に DataFrame を代入していることになり、おかしいのではないでしょうか?

dataset["direction_of_3"] = dataset.apply(direction_of_3)

ある列 (行) だけに適用したい場合は Series の apply 関数を呼び出してください

python

1def func(x): 2 return 2 * x 3 4df['a'] = df['a'].apply(func) 5df
abc
1258
2486

投稿2019/02/08 16:36

編集2019/02/08 16:38
tiitoi

総合スコア21956

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

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

J1N

2019/02/09 03:18

教えていただき、ありがとうございます。 非常によく理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問