Python 搜索dataframe的一个值,如果它大于参考值,则替换为另一个dataframe中的参考值

Python 搜索dataframe的一个值,如果它大于参考值,则替换为另一个dataframe中的参考值,python,pandas,dataframe,Python,Pandas,Dataframe,我在Python中有两个表,分别是df1和df2 数据帧-df1(100条记录) df2(2000年记录) df1具有客户和信用额度的唯一条目,df2具有针对客户的多个交易记录。 现在,我必须针对每个客户和金额在df2中进行检查,如果任何客户的交易金额大于df1的限额,则在df2中用df1的限额值替换它 简而言之——如果客户A1和df2中的金额大于df1中客户A1的限额,则用df1中的限额值替换df2中的金额值 期望输出为: df3: 尝试使用以下方法: df3 = df2.merge(df1[

我在Python中有两个表,分别是df1和df2

数据帧-df1(100条记录)

df2(2000年记录)

df1具有客户和信用额度的唯一条目,df2具有针对客户的多个交易记录。 现在,我必须针对每个客户和金额在df2中进行检查,如果任何客户的交易金额大于df1的限额,则在df2中用df1的限额值替换它

简而言之——如果客户A1和df2中的金额大于df1中客户A1的限额,则用df1中的限额值替换df2中的金额值

期望输出为:

df3:

尝试使用以下方法:

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

您可以通过如下方式使用apply执行此操作:

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)
输出
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