Заменить подмножество Python данных в зависимости от условия - PullRequest
0 голосов
/ 25 марта 2020

У меня есть 2 dfs:

df = pd.DataFrame({'Friend1':['Amy','Bob','Charlie'],'Friend2':['Dan','Ellie','Fred'],'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})

    Friend1 Friend2 a   b   c
0   Amy     Dan     1   4   7
1   Bob     Ellie   2   5   8
2   Charlie Fred    3   6   9

df2 = pd.DataFrame({'Friend1:['Zack','Yuna'],'Friend2':['Bob','Charlie'], 'b':[100,200], 'c':[300,400]})

    Friend1 Friend2 b   c
0   Zack    Bob     100 300
1   Yuna    Charlie 200 400

Как мне заменить то, что в df2, на df, чтобы новый df стал:

    Friend1 Friend2 a   b   c
0   Amy     Dan     1   4   7
1   Bob             2   100 300
2   Charlie         3   200 400

Обратите внимание, что мне нужен Друг 2, чтобы быть пусто для Боба и Чарла ie в новом дф.

Я пробовал что-то вроде

df.loc[df[df.Friend1.isin(['Bob','Charlie'])].index,'b':'c'] = df2.drop(['Friend1','Friend2'],axis=1)

Но это не работает. Помощь!

1 Ответ

2 голосов
/ 25 марта 2020

Возможно, вы захотите использовать df.update. Во-первых, переиндексируйте два ваших фрейма данных:

df=df.set_index('Friend1')
df2=df2.set_index('Friend2')

Затем обновите df в соответствии с информацией в df2:

df.update(df2)

Учитывая, что вам нужно, чтобы Friend 2 был пустым для Боба и Чарла ie в новом df вы можете использовать:

df.loc[df.index.isin(['Bob','Charlie']),'Friend2']=None

Дает вам вывод:

        Friend2  a      b      c
Friend1                         
Amy         Dan  1    4.0    7.0
Bob        None  2  100.0  300.0
Charlie    None  3  200.0  400.0

Если вы не можете переиндексировать, тогда попробуйте:

df.loc[df['Friend1'].isin(['Bob','Charlie']),'Friend2']=None
df.loc[df['Friend1'].isin(['Bob','Charlie']),['b','c']]=df2.loc[:,['b','c']].values

дает вам тот же результат. Но это зависит от того, как выглядят ваши исходные кадры данных, коды не такие динамичные c, как df.update!

...