実現したいこと
データフレーム内の条件で指定した2つのセルの合計値を出す、又は対象のセルに値がある場合はその値をセルに代入する
ということを実現したいです。
具体的には、以下表を参照してください。
表①から表②のように、「計算結果」を、データフレーム内で計算をしたいです。
【表①】
A | B | C |
---|---|---|
9/1 | 0 | 11 |
9/2 | 0 | 0 |
9/3 | 0 | 0 |
9/4 | 10 | 0 |
9/5 | 0 | 0 |
9/6 | 1 | 0 |
9/7 | 1 | 25 |
⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓
【表②】
A | B | C | 計算結果 |
---|---|---|---|
9/1 | 0 | 11 | 11 |
9/2 | 0 | 0 | 11 |
9/3 | 0 | 0 | 11 |
9/4 | 10 | 0 | 21 |
9/5 | 0 | 0 | 21 |
9/6 | 1 | 0 | 22 |
9/7 | 1 | 25 | 25 |
エクセルの計算式で書くとすると、
「=if(C3<>0,C3,計算結果2+B3)」
という感じになると思います。
なぜこれを実現しないといけないのか
現在売上高を集計し、Matplotlibで描画をすることを想定した、
以下の条件のあるデータフレームを作成しているためです。
date | 当日分売上 | 仮売上高合計 | 確定売上高合計 | 暫定売上高合計(集計部分) |
---|---|---|---|---|
2022/7/1 | 0 | 0 | 100 | 100 |
2022/7/2 | 100 | 200 | 0 | 300 |
2022/7/3 | 200 | 300 | 600 | 600 |
2022/7/4 | 200 | 500 | 0 | 800 |
2022/7/5 | 0 | 500 | 0 | 800 |
2022/7/6 | 400 | 900 | 0 | 1200 |
2022/7/7 | 100 | 1000 | 1000 | 1000 |
列「当日分売上」というのは、各担当から申告があった数値を毎日反映し、
列「仮売上高合計」はその当日売上をcumsumで集計しています。
確定売上高合計は、ランダムな日にちで、確定した売上高合計の情報が入手でき、
それまでの集計を無視して、「確定売上高合計」と「暫定売上高合計(集計部分)」に正しい数値が入ります。
試したこと
確定売上高合計の1行目にデータがある場合、
且つ以下のサンプルデータのC列に0以外の数字が2つ以上ない場合、
エラーが発生します。
import pandas as pd import io csv_data = ''' A,B,C 9/1, 0, 11,11 9/2, 0, 0,11 9/3 ,0 ,0,11 9/4, 10, 0,21 9/5, 0, 0,21 9/6, 1, 0,22 ''' df = pd.read_csv(io.StringIO(csv_data)) print(df['C'].ne(0).cumsum()) df['計算結果'] = df.groupby(df['C'].ne(0).cumsum(), group_keys=False)\ .apply(lambda x: x['B'] + (x.iloc[0]['C']-x.iloc[0]['B']*(x.iloc[0]['C']>0))) print(df)
以下エラー内容
python
1ValueError: Expected a 1D array, got an array with shape (6, 6)
エラーは、サンプルデータの一番下に9/7,1,25を追加すると改善されます。
どなたかご知見があれば教えていただきたく投稿しました。
お忙しいところ恐れ入りますが、ご知見のある方、ご協力いただければ幸いです。
以上、よろしくお願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/27 05:38