搜索数据框的一个值,如果大于参考值,则用另一数据框的参考值替换

时间:2020-01-04 20:08:23

标签: python pandas dataframe

我在Python熊猫df1和df2中有两个表。

DataFrame -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中的金额大于客户A1在df1中的限制,则用df1中的限制值替换df2中的Amount值。

所需的输出是:

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

2 个答案:

答案 0 :(得分:0)

尝试使用此功能:

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

答案 1 :(得分:0)

您可以使用以下应用来做到这一点:

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