Заменить значения в фрейме данных, относящиеся только к тем, которые совпадают в другом фрейме данных - PullRequest
1 голос
/ 04 августа 2020

У меня есть один фрейм данных, который выглядит так:

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

и другой, который выглядит так

manualreplace

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 экземпляра или замены значений в кадре данных, который соответствует точному размеру заменяющего его.

Любая помощь будет принята с благодарностью, поскольку я пытался использовать несколько вариантов .lo c, но в конечном итоге заменяет все значения значениями в возрастающем порядке из фрейма данных b, а не только точные совпадения.

edit: попытки

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

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Вы можете попробовать 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
0 голосов
/ 04 августа 2020

"update" можно использовать для получения требуемого результата.

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
0 голосов
/ 04 августа 2020

Возможно, это не лучший способ, но он работает:

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)
...