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