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

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

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

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

Python

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

pandas

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

Q&A

解決済

2回答

2052閲覧

Pandasでほかの行のデータを関数の引数にとる

pinocookie

総合スコア17

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2018/07/12 22:35

現在、以下のようなにデータについて分析を行っています。

日付(DatetimeIndex)商品名売上数量廃棄数
2017-01-01...321
2017-01-02...370
2017-01-03...390
2017-01-04...310
2017-01-05...270
2017-01-06...420
2017-01-07...222
2017-01-08...451
............

このデータの列の情報を使用して、新しく計算した列(例:在庫数)を付け加えようと考えています。

このとき計算に必要な情報は、(1日前の在庫 + 2日前の発注数) - (廃棄数 + 売上数) のようになっています。
そのためこのデータフレームに、以上のデータを引数として関数を作成すると、同じ行からだけではなく、異なる行のデータも取得して計算させなければなりません。

Excelであれば簡単に計算できるんですが、PandasやPythonの機能に異なる行の要素を引数にとり関数を適用させる方法はあるんでしょうか。

よろしくお願いします。


イメージとしてはまず手元に以下の情報があります。

日付(DatetimeIndex)商品名売上数量廃棄数発注数在庫数
2017-01-01...3219070
2017-01-02...370037
2017-01-03...3900...
2017-01-04...31090...
2017-01-05...1800...
2017-01-06...4200...
2017-01-07...222120...
2017-01-08...1510...
............

この在庫数の列の3行目から計算を始めるイメージです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

他の行のデータを使用するのは R.Shigemoriさんの書かれている通り,shift() を利用するのが良いかと思います。

今回のケースで面倒なのは、自分自身('発注数')の前の日の値を使用して計算をする必要があり、一括で計算することはできず、上から順番に計算をしなければならないことです。

この様な場合はループを使って

Python

1for idx,row in df.iloc[2:].iterrows(): 2 df.loc[idx, '在庫数'] = df.shift(1).loc[idx, '在庫数'] + df.shift(2).loc[idx, '発注数'] - row['売上数量'] - row['廃棄数']

のように書くことになると思います。

一応・・。
宗教上の理由などで、どうしてもループを使って書きたくないという場合は、
先に前日との差分データを作成しておき cumsum() を使うことで

Python

1diff = df['発注数'].shift(2) - df['廃棄数'] - df['売上数量'] 2diff[0] = df['在庫数'].iloc[0] 3diff[1] = df['在庫数'].iloc[1] - df['在庫数'].iloc[0] 4df['発注数'] = diff.cumsum().astype('int'))

のようにも書くことが出来ます。

投稿2018/07/13 00:24

magichan

総合スコア15898

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

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

pinocookie

2018/07/13 04:32

回答ありがとうございます! 手元にデータがないので適当に自作したデータで確かめたところ、しっかりと計算式通りに計算できていることが確認できました。 ありがとうございました!
guest

0

shiftメソッドを活用するといいかと思います。コードは以下です。

python

1df['在庫'].shift(1)+df['発注'].shift(2)-df['廃棄']-df['売上']

考え方は、shiftを使って1日前の在庫データを当日の行にずらして計算に使うというものです。locを使って過去データを参照する方法もあるように思いますが、こちらのほうが簡単と思います

投稿2018/07/12 23:22

R.Shigemori

総合スコア3376

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

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

magichan

2018/07/12 23:48 編集

実際に動作させてみると判ると思いますが。 計算する段階で、1/3 移行の'在庫数'列のデータは NaN なので 1/4 移行の在庫数はこの式では計算できないと思いますよ。
R.Shigemori

2018/07/13 04:02

ですね。 過去データがあるものと思い込んでいました。 とすると、for文で繰り返し処理にするのが有力候補ですね。個人的にはfor文が嫌いなので再帰処理を応用した関数を作ると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問