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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

pandas

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

Q&A

解決済

1回答

456閲覧

データフレーム内の数値を、if文で複数分岐してセルの合計値を出したい

karakarakarappo

総合スコア28

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

pandas

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

0グッド

0クリップ

投稿2022/07/29 15:31

実現したいこと

データフレーム内の条件で指定した2つのセルの合計値を出したいです。

以下に記載しております、表①から表②のように、「計算結果」を、データフレーム内で計算をしたいです。

表①

ABC
110
230
367
4100
5150
6210
7280
8360
94555
10550
11660
12780

⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓

表②

ABC計算結果
1101
2303
3677
410011
515016
621022
728029
836037
9455555
1055065
1166076
1278088

エクセルの計算式で書くとすると、「=if(C3>0,C3,D2+A3)」という感じになると思います。

なぜこれを実現しないといけないのか

現在売上高を集計し、Matplotlibで描画をすることを想定した、
以下の条件のあるデータフレームを作成しているためです。

date当日売上仮売上高合計確定売上高合計暫定売上高合計(集計部分)
2022/7/11001000100
2022/7/21002000200
2022/7/3200400600600
2022/7/42006000800
2022/7/506000800
2022/7/630090001100
2022/7/7100100010001000
2022/7/8300100001300

列「当日売上」というのは、各担当から申告があった数値毎日反映し、
列「仮売上高合計」はその当日売上をcumsumで集計しています。
確定売上高合計は、ランダムな日にちで、確定した売上高合計の情報が入手でき、
それまでの集計を無視して、「確定売上高合計」と「暫定売上高合計(集計部分)」に正しい数値が入ります。

エクセルで集計すればいいじゃんと思われる方もいらっしゃると思うのですが、
なんとかpythonでコード化したいと考えています。

検討したこと、試したこと

以下エラーコードの部分にて、lamda関数で組んでみたのですが、
lamadaで計算をする前に列が存在しないため、そもそも集計できないといったエラーになってしまいます。
最初から空の列を追加しておいても、参照するのは空の値になるので、問題解決にはなりませんでした。。。

以下にテーブルデータを添付しますので、ご利用ください。

python

1import pandas as pd 2import io 3 4csv_data = ''' 5A,B,C 61,1,0 72,3,0 83,6,7 94,10,0 105,15,0 116,21,0 127,28,0 138,36,0 149,45,55 1510,55,0 16 17''' 18df = pd.read_csv(io.StringIO(csv_data))

Error内容

python

1 2df['計算結果'] = df.apply(lambda x: x['C'] 3 if x['C'] != 0 4 else (x['A'] + x['計算結果'].shift(fill_value=0)) , 5 axis=1) 6 7(df) 8 9KeyError: '計算結果' 10 11

お忙しいところ恐れ入りますが、ご知見のある方、ご協力いただければ幸いです。

以上、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1import pandas as pd 2import io 3 4csv_data = ''' 5A,B,C 61,1,0 72,3,0 83,6,7 94,10,0 105,15,0 116,21,0 127,28,0 138,36,0 149,45,55 1510,55,0 1611,66,0 1712,78,0 18''' 19df = pd.read_csv(io.StringIO(csv_data)) 20 21df['計算結果'] = df.groupby(df['C'].gt(0).cumsum(), group_keys=False)\ 22 .apply(lambda x: x['B'] + 23 (x.iloc[0]['C']-x.iloc[0]['B']*(x.iloc[0]['C']>0))) 24 25print(df)
ABC計算結果
1101
2303
3677
410011
515016
621022
728029
836037
9455555
1055065
1166076
1278088

投稿2022/07/29 17:58

melian

総合スコア19849

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

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

karakarakarappo

2022/07/31 04:42

ご協力頂きありがとうございました。 記載頂いたコードを改良したところ、自身で組んでいるコードでも同様の結果を得ることができました。 .gt(0)というものがありことを知ることができ、.ne(0)で処理をすることで対処できました。 引き続き何あれば、ご協力いただければ幸いです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問