2

我有两个数据框,如下所示。如何通过 3 减去 10 和 2 减去 55 来替换 Bank1 数据?

import pandas as pd

data = [['Bank1', 10, 55], ['Bank2', 15,65], ['Bank3', 14,54]]
df1 = pd.DataFrame(data, columns = ['BankName', 'Value1','Value2'])

在此处输入图像描述

df2 = pd.DataFrame([[3, 2]], columns = ['Value1','Value2'])

在此处输入图像描述

所需输出(仅替换 Bank1 中的值):

银行名称 价值1 价值2
银行1 7 53
银行2 15 65
银行3 14 54
4

2 回答 2

3

尝试,使用sub+combine_first

df1.sub(df2).combine_first(df1)

  BankName  Value1  Value2
0    Bank1     7.0    53.0
1    Bank2    15.0    65.0
2    Bank3    14.0    54.0
于 2021-10-14T03:26:47.107 回答
0

第一个解决方案是indexdf22by Banknamefor align bydf1中创建正确的行子运算:

df.set_index('BankName').sub(df2.set_index([['Bank1']]), fill_value=0)

df.set_index('BankName').sub(df2.set_index([['Bank2']]), fill_value=0)

您需要在df2with中创建新列,在两个s 中都BankName转换BankName为,因此可以减去此行:indexDataFrame

df22 = df2.assign(BankName = 'Bank1').set_index('BankName')
df = df1.set_index('BankName').sub(df22, fill_value=0).reset_index()
print (df)
  BankName  Value1  Value2
0    Bank1     7.0    53.0
1    Bank2    15.0    65.0
2    Bank3    14.0    54.0

减去Bank2

df22 = df2.assign(BankName = 'Bank2').set_index('BankName')
df = df1.set_index('BankName').sub(df22, fill_value=0).reset_index()
print (df)

  BankName  Value1  Value2
0    Bank1    10.0    55.0
1    Bank2    12.0    63.0
2    Bank3    14.0    54.0

过滤器的另一种解决方案BankName

m = df1['BankName']=='Bank1'
df1.loc[m, df2.columns] = df1.loc[m, df2.columns].sub(df2.iloc[0])
print (df1)
  BankName  Value1  Value2
0    Bank1       7      53
1    Bank2      15      65
2    Bank3      14      54

m = df1['BankName']=='Bank2'
df1.loc[m, df2.columns] = df1.loc[m, df2.columns].sub(df2.iloc[0])
于 2021-10-14T03:47:07.147 回答