替换数据框中的值仅与另一个数据框中匹配的值有关

时间:2020-08-04 16:54:30

标签: python pandas dataframe replace loc

我有一个像这样的数据框:

clientdata

account  client   assets
A        bob      1000 
A        frank    1000
A        jim      1000
A        howie    1000
B        bob      2000 
B        frank    2000
B        jim      2000
C        frank    500
C        howie    500
D        bob      250
D        jim      250
D        howie    250

和另一个看起来像这样的

手动替换

account  assets
B        2150
D        750

我想用在帐户列上匹配的每个实例的新金额替换第一个数据框中的资产的每个实例。

clientdata

account  client   assets
A        bob      1000 
A        frank    1000
A        jim      1000
A        howie    1000
B        bob      2150
B        frank    2150
B        jim      2150
C        frank    500
C        howie    500
D        bob      750
D        jim      750
D        howie    750

我发现的大多数示例都是替换1个实例或替换与替换该实例的大小完全相同的数据框中的值的其他例子。

当我尝试使用.loc的几种变体时,任何帮助将不胜感激,但最终将所有值替换为数据帧b中的升序值,而不仅仅是精确匹配。

编辑: 尝试

clientdata.loc[clientdata.account.isin(manualdata.account), ['assets']] = manualdata.loc[manualdata.account.isin(clientdata.account), ['assets']].values

3 个答案:

答案 0 :(得分:1)

您可以先尝试map,然后再尝试isna

clientdata['assets'] = (clientdata['account'].map(manualreplace.set_index('account')['assets'])
                           .fillna(clientdata['assets'])
                       )

输出:

   account client  assets
0        A    bob  1000.0
1        A  frank  1000.0
2        A    jim  1000.0
3        A  howie  1000.0
4        B    bob  2150.0
5        B  frank  2150.0
6        B    jim  2150.0
7        C  frank   500.0
8        C  howie   500.0
9        D    bob   750.0
10       D    jim   750.0
11       D  howie   750.0

答案 1 :(得分:0)

这可能不是最好的方法,但是它可行:

df = pd.merge(cd_df, rep_df, how="left", on="account", )
df["assets"] = df["assets_y"]
df.loc[pd.isna(df["assets_y"]), "assets"] = df["assets_x"]
df = df.drop(["assets_x", "assets_y"], axis=1)

答案 2 :(得分:0)

“更新”可用于获取所需的结果。

account = ['A','A','A','A','B','B','B','C','C']
client = ['bob','frank','jim','howie','bob','frank','howie','bob','frank']
asset = [1, 2, 3,1,2,3,1,2,3]

df1 = pd.DataFrame({'account':account, 'client':client, 'asset':asset})
assets = [100, 110]
account = ['B', 'C']

df2 = pd.DataFrame({'account':account, 'asset':assets})


df1 = df1.set_index('account')
df2 = df2.set_index('account')
df1.update(df2)
df1