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

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

ただいまの
回答率

90.33%

  • Python

    9268questions

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

  • Python 3.x

    7440questions

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

  • pandas

    682questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 253

pinocookie

score 11

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

日付(DatetimeIndex) 商品名 売上数量 廃棄数
2017-01-01 ... 32 1
2017-01-02 ... 37 0
2017-01-03 ... 39 0
2017-01-04 ... 31 0
2017-01-05 ... 27 0
2017-01-06 ... 42 0
2017-01-07 ... 22 2
2017-01-08 ... 45 1
... ... ... ...

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

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

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

よろしくお願いします。


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

日付(DatetimeIndex) 商品名 売上数量 廃棄数 発注数 在庫数
2017-01-01 ... 32 1 90 70
2017-01-02 ... 37 0 0 37
2017-01-03 ... 39 0 0 ...
2017-01-04 ... 31 0 90 ...
2017-01-05 ... 18 0 0 ...
2017-01-06 ... 42 0 0 ...
2017-01-07 ... 22 2 120 ...
2017-01-08 ... 15 1 0 ...
... ... ... ...

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

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

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

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/13 13:32

    回答ありがとうございます!

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

    キャンセル

0

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/13 08:47 編集

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

    キャンセル

  • 2018/07/13 13:02

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

    キャンセル

同じタグがついた質問を見る

  • Python

    9268questions

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

  • Python 3.x

    7440questions

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

  • pandas

    682questions

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