鑒于具有三筆貸款的 pandas 資料框,我需要將付款添加到資料框中,其中付款金額是總貸款金額/付款次數。如果 seq = 0,是貸款金額,否則 seq 是付款號碼。我可以這樣做,iterrows()但是資料框非常大,我想找到一個不同的解決方案。
這是我的嘗試:
import pandas as pd
rows = [{'id': 'x1', 'seq': 0, 'amount': 2000, 'payments': 4 },
{'id': 'x2', 'seq': 0, 'amount': 4000, 'payments': 2 },
{'id': 'x3', 'seq': 0, 'amount': 9000, 'payments': 3 }]
df = pd.DataFrame(rows)
df2 = df.copy()
for index, row in df.iterrows():
num = range(row['payments'])
for i in num:
payment_amount = row['amount'] / row['payments']
row2 = {'id': row['id'], 'seq': i 1 , 'amount': payment_amount, 'payments': 0 }
df2 = df2.append(row2, ignore_index=True)
結果應該是:
id seq amount payments
0 x1 0 2000.0 4
1 x2 0 4000.0 2
2 x3 0 9000.0 3
3 x1 1 500.0 0
4 x1 2 500.0 0
5 x1 3 500.0 0
6 x1 4 500.0 0
7 x2 1 2000.0 0
8 x2 2 2000.0 0
9 x3 1 3000.0 0
10 x3 2 3000.0 0
11 x3 3 3000.0 0
但是沒有使用iterrows(). 這可能嗎?
uj5u.com熱心網友回復:
更新:
df_pay = df.iloc[df.index.repeat(df['payments'])]\
.eval('amount = amount / payments')\
.assign(payments=0)
df_pay['seq'] = df_pay.groupby('id').cumcount() 1
pd.concat([df, df_pay], ignore_index=True)
輸出:
id seq amount payments
0 x1 0 2000.0 4
1 x2 0 4000.0 2
2 x3 0 9000.0 3
3 x1 1 500.0 0
4 x1 2 500.0 0
5 x1 3 500.0 0
6 x1 4 500.0 0
7 x2 1 2000.0 0
8 x2 2 2000.0 0
9 x3 1 3000.0 0
10 x3 2 3000.0 0
11 x3 3 3000.0 0
嘗試這個:
pd.concat([df,
df.iloc[df.index.repeat(df['payments'])]\
.eval('amount = amount / payments')\
.assign(payments=0)])
輸出:
id seq amount payments
0 x1 0 2000.0 4
1 x2 0 4000.0 2
2 x3 0 9000.0 3
0 x1 0 500.0 0
0 x1 0 500.0 0
0 x1 0 500.0 0
0 x1 0 500.0 0
1 x2 0 2000.0 0
1 x2 0 2000.0 0
2 x3 0 3000.0 0
2 x3 0 3000.0 0
2 x3 0 3000.0 0
使用技巧pd.Index.repeat生成付款記錄。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/448856.html
下一篇:在兩個串列之間排序最大值
