我有一个像这样的数据框:
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
答案 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