私は、コレクションをループしてpandasに変換し、条件付き合計と実行中の合計に基づいて各値を更新します。この関数は基本的にこのパンダは2番目の列に積算合計で適用されます
def calculate_value():
cumulative_amount = 0
for row in rows:
if row['amount'] < 0:
return 0
amount = 0
if row['kind'] == 'A':
amount = row['amount'] * row['input_amount']
elif row['kind'] == 'B':
amount = row['input_amount'] - cumulative_amount
elif row['kind'] == 'C':
amount = row['amount']
cumulative_amount += amount
row['result'] = amount
if row['kind'] == 'B':
break
return rows
、すべての行をループのように見える、とresult
値を追加します。しかし、このresult
は、累積稼働合計によって異なる場合があります。さらに、特定の値(row['kind'] == 'B'
)に達した場合、新しい行の処理を中断して停止する必要があります。
これをパンダに変換すると、apply
を使用しているようです。これまでのところ、私はのコードをとしていますが、cumulative_amount
をshift(-1)
としてみると、それはいつもnan
に戻ります。
パンダでこれを行うにはどうすればよいですか?私はこれを正しく理解していれば
def calculate_value(row: Series):
if row['amount'] < 0 or row.shift(-1)['kind'] == 'B':
row['cumulative_amount'] = 0
row['result'] = 0
return row
amount = 0
if np.isnan(row.shift(-1)['cumulative_amount']):
cumulative_amount = 0
else:
cumulative_amount = row.shift(-1)['cumulative_amount']
if row['kind'] == 'A':
amount = row['amount'] * row['input_amount']
elif row['kind'] == 'B':
amount = row['input_amount'] - cumulative_amount
elif row['kind'] == 'C':
amount = row['amount']
row['cumulative_amount'] = amount + cumulative_amount
row['result'] = amount
return row
df['cumulative_amount'] = 0
new_df = df.apply(lambda x: calculate_value(x), axis=1)
入力し、所望の出力の例は
df = pd.DataFrame({
'kind': {1: 'C', 2: 'E', 3: 'A', 4: 'A', 5: 'B', 6: 'C'},
'amount': {1: -800, 2: 100, 3: 0.5, 4: 0.5, 5: 0, 6: 200},
'input_amount': {1: 800, 2: 800, 3: 800, 4: 800, 5: 800, 6: 800}
})
amount input_amount kind cumulative_amount result
1 -800.0 800 C 0.0 0.0
2 100.0 800 E 0.0 0.0
3 0.5 800 A 400.0 400.0
4 0.5 800 A 800.0 400.0
5 0.0 800 B 800.0 0.0
6 200.0 800 C 800.0 0.0
同じ入力データフレームと予想される出力を提供できますか? –
@ScottBostonが完了しました。 –
'apply'は、行ごとに動作し、計算中にデータフレームの他の行にアクセスすることは期待されないので、ここでの良いアプローチのようには見えません。あなたの最初の解決策は私にとっては絶対に素晴らしいと思われます。 –