Python - 複数の条件付きロジックを一意のアカウント インスタンスに適用する

okwaves2024-01-24  7

StackExchange で、(1) 2 つのステートメントの条件付きロジック (b) を一意のアカウントのセットに毎回適用するメソッドを探し回っていました (無駄でした)。たとえば、次のテスト データを使用しています。

test = pd.DataFrame({'account':['a','a','a','b','b','b'],
                    'tot_chg':[2072,2072,2072,322,322,322],
                    'billed':[2072,2072,2072,322,322,322],
                    'denied':[1878,1036,1036,322,161,161],
                    'denied_sum':[1878,2914,3950,322,483,644]})

これにより、次の出力が生成されます。

    account  tot_chg  billed    denied  denied_sum
0   a           2072    2072    1878    1878
1   a           2072    2072    1036    2914
2   a           2072    2072    1036    3950
3   b            322     322     322     322
4   b            322     322     161     483
5   b            322     322     161     644

denyed_sum は、各アカウントの拒否された列の累積合計であることに注意してください。

したがって、各アカウント (つまり、「a」、次に「b」など) について、条件ステートメントで次のいずれかを返したいと思います: (1) Denial_sum が tot_chg 金額を超えた場合の最大拒否金額、または (2) Denial_sum が tot_chg と正確に等しい場合の拒否された金額。

私は次のことを試しました:

test['new'] = np.where(test['denied_sum'] == test['tot_chg'], test['denied_sum'],\
         np.where(test['denied_sum'] > test['tot_chg'], max(test['denied']),0))

結果:

    account    tot_chg  billed  denied  denied_sum  new
0   a           2072    2072    1878    1878          0
1   a           2072    2072    1036    2914       1878
2   a           2072    2072    1036    3950       1878
3   b            322     322     322     322        322
4   b            322     322     161     483       1878
5   b            322     322     161     644       1878

終わりますが、以下をご覧ください:

    account    tot_chg  billed  denied  denied_sum  new
0   a           2072    2072    1878    1878       1878
1   a           2072    2072    1036    2914          0
2   a           2072    2072    1036    3950          0
3   b            322     322     322     322        322
4   b            322     322     161     483          0
5   b            322     322     161     644          0

何かを定義する必要があるかもしれないと言われています最初に関数を作成し、それを groupby および apply 関数と組み合わせて使用​​しますが、すべての部分をまとめる方法がよくわかりません。よろしくお願いいたします。



------------------------

df.loc または df.where のいずれかを使用できます。

.loc を使用した解決策は次のとおりです

test['new'] = test.denied_sum.to_numpy()
test.loc[test.denied_sum.gt(test.tot_chg), 'new'] = 0 # or use `.ge(` inestead of gt for "greater than or equal"

df.where(cond, other) は、条件が true の場合は現在の値を保持し、false の場合は他の値 (スカラー、配列、または呼び出し可能) に置き換えます。

test['new'] = test.denied_sum.to_numpy()
test.new.where(test.denied_sum.le(test.tot_chg), other=0, inplace=True)

5

テストは行っていません。バグを見つけたらお知らせください。

– リッチーV

2020 年 9 月 3 日 2:58

リッチー、ありがとう!よく働く。実際、私はここでのあなたのたった1つの回答でいくつかのことを学びました。この質問に対する一種のフォローアップとして、この where 関数に複数の条件を組み込むことは可能ですか?最初に test.denied_sum.gt(test.tot_chg) と入力し、true の場合は test.denied_sum を指定しますが、そうでない場合は test.denied_sum.le(test.tot_chg) などを続けます。

– ゲイブ・ヴェルジーノ

2020 年 9 月 3 日 17:05

1

mask = (cond1 & cond2) | のように、さまざまな条件を組み合わせて構成されるブール マスクを確実に作成できます。 alter_cond1 ですが、新しい例は少し違うようです。 if sum.gt(tot_chg): sum; elif sum.le(tot_chg): ???

– リッチーV

2020 年 9 月 3 日 17:12

1

いいえ、それはそうですね、私はランダムな例をでっちあげただけです... ブール型マスク、わかりました!これからそれらについて学びに行くつもりです。改めて感謝いたします!

– ゲイブ・ヴェルジーノ

2020 年 9 月 3 日 17:15

こんにちは @RichieV 2 つの追加条件を備えた同じサンプル データセットが含まれているため、この多少関連する質問に回答していただければ幸いです stackoverflow.com/questions/64296347/…

– ゲイブ・ヴェルジーノ

2020 年 10 月 10 日 20:49

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。