我在Python pandas df1和df2中有两个表。
数据帧 -df1(100 条记录(。
No Customer Age City Product Limit Company Segment
1 A1 46.49 BANGALORE Gold 500000.0 C1 Self Employed
2 A2 46.49 CALCUTTA Silver 100000.0 C2 Salaried_MNC
3 A3 46.49 COCHIN Platimum 10000.0 C3 Salaried_Pvt
4 A4 46.49 BOMBAY Platimum 10001.0 C4 Govt
5 A5 46.49 BANGALORE Platimum 10002.0 C5 Normal Salary
DF2(2000 条记录(
No: Customer Month Type Amount
1 A1 12-Jan-04 JEWELLERY 585470.80
2 A1 3-Jan-04 PETRO 410556.13
3 A1 15-Jan-04 CLOTHES 23740.46
4 A3 25-Jan-04 FOOD 8000.47
5 A3 17-Jan-05 CAMERA 16000.07
DF1具有客户和信用额度的唯一条目,DF2具有针对客户的多个交易记录。 现在我必须针对每个客户和金额检查 df2,在 df2 中,如果任何客户的交易金额大于 df1 的限制,则将其替换为 df1 的极限值。
简而言之 - 如果客户 A1 和 df2 中的金额大于 df1 中客户 A1 的限制,则用 df1 中的限制值替换 df2 中的金额值。
期望的输出是:
DF3:
No: Customer Month Type Amount
1 A1 12-Jan-04 JEWELLERY 500000.00
2 A1 3-Jan-04 PETRO 410556.13
3 A1 15-Jan-04 CLOTHES 23740.46
4 A3 25-Jan-04 FOOD 8000.47
5 A3 17-Jan-05 CAMERA 10000.00
尝试使用这个:
df3 = df2.merge(df1[['Customer','Limit']], how='left', on='Customer')
df3.loc[df3['Amount']>df3['Limit'], 'Amount'] = df3['Limit']
df3.drop('Limit', axis=1, inplace=True)
结果:
No: Customer Month Type Amount
0 1 A1 12-Jan-04 JEWELLERY 500000.00
1 2 A1 3-Jan-04 PETRO 410556.13
2 3 A1 15-Jan-04 CLOTHES 23740.46
3 4 A3 25-Jan-04 FOOD 8000.47
4 5 A3 17-Jan-05 CAMERA 10000.00
你可以像这样使用应用程序来做到这一点:
def check_limit(row):
limit = next(iter(df1.loc[df1['Customer'] == row["Customer"]]["Limit"]),0)
return min(limit,row["Amount"])
df2["Amount"] = df2.apply(check_limit, axis=1)
print(df2)
输出
No Customer Month Type Amount
0 1 A1 12-Jan-04 JEWELLERY 500000.00
1 2 A1 3-Jan-04 PETRO 410556.13
2 3 A1 15-Jan-04 CLOTHES 23740.46
3 4 A3 25-Jan-04 FOOD 8000.47
4 5 A3 17-Jan-05 CAMERA 10000.00