Я пытаюсь заменить значения строк в одном кадре данных другим.

Ниже приведен пример кода

import pandas as pd
import numpy as np
from pprint import pprint

raceA = ['r1','r3','r4','r5','r6','r7','r8', 'r9']
qualifierA = ['last','first','first','first','last','last','first','first']
participantA = ['rat','rat','cat','cat','rat','dog','dog','dog']
dfA = pd.DataFrame(
    {'race':raceA,
     'qualifier':qualifierA,
     'participant':participantA

    }
)
pprint(dfA)

raceB = ['r1','r2','r3','r4','r5','r6','r7','r8', 'r9','r10']
qualifierB = ['last',np.nan,np.nan,'first','first','last','last','first','first',np.nan]
participantB = ['rat','rat',np.nan,'cat','cat','rat','dog','dog',np.nan,np.nan]
dfB = pd.DataFrame(
    {'race':raceB,
     'qualifier':qualifierB,
     'participant':participantB

    }
)
pprint(dfB)
dfB.loc[dfB.race.isin(dfA.race), ['qualifier','participant']] = dfA[['qualifier','participant']]
pprint(dfB)

Например, в dfA,

r9     first         dog

DFB содержит,

 r9     first         NaN

Желаемый выход: дфБ

r9     first         dog

Выход получен:

r9       NaN         NaN

Может ли кто-нибудь разобраться в этом?

0
Natasha 28 Июн 2019 в 13:45

3 ответа

Лучший ответ

Используйте DataFrame.fillna с фреймом данных как:

df = dfB.set_index('race').fillna(dfA.set_index('race')).reset_index()

print(df)
  race qualifier participant
0   r1      last         rat
1   r2       NaN         rat
2   r3     first         rat
3   r4     first         cat
4   r5     first         cat
5   r6      last         rat
6   r7      last         dog
7   r8     first         dog
8   r9     first         dog
9  r10       NaN         NaN

Или используя update:

dfB = dfB.set_index('race')
dfA = dfA.set_index('race')

dfB.update(dfA)

print(dfB.reset_index())
 race qualifier participant
0   r1      last         rat
1   r2       NaN         rat
2   r3     first         rat
3   r4     first         cat
4   r5     first         cat
5   r6      last         rat
6   r7      last         dog
7   r8     first         dog
8   r9     first         dog
9  r10       NaN         NaN
2
Sandeep Kadapa 28 Июн 2019 в 11:22

Я хотел бы сделать что-то подобное в несколько этапов.

Сначала я объединю два кадра данных -

dfB_PreProcessing = dfB.merge(dfA,left_on='race',right_on='race',how="left")

введите описание изображения здесь Затем очистите столбец участника -

dfB_PreProcessing['participant_x'] = dfB_PreProcessing['participant_x'] .replace(np.nan, '', regex=True)
dfB_PreProcessing['participant'] = np.where(dfB_PreProcessing['participant_x'] == '', dfB_PreProcessing['participant_y'], dfB_PreProcessing['participant_x'])

Затем очистите столбец классификатора (если необходимо) -

dfB_PreProcessing['qualifier_x'] = dfB_PreProcessing['qualifier_x'] .replace(np.nan, '', regex=True)
dfB_PreProcessing['qualifier'] = np.where(dfB_PreProcessing['qualifier_x'] == '', dfB_PreProcessing['qualifier_y'], dfB_PreProcessing['qualifier_x'])*

Затем выберите только необходимые столбцы в качестве выходных df-

dfB = dfB_PreProcessing.loc[:,['race','qualifier','participant']]

enter image description here

Дайте мне знать, если это работает или нет.

1
MMS 28 Июн 2019 в 11:22

Поправьте меня, если я не получаю это правильно. Если вы хотите обновить строку из одного или нескольких столбцов, вы можете обновить значение этого конкретного индекса этого столбца. например. Если я хочу обновить все строки в столбце B, то

df = pd.DataFrame({'A':[1,2,3],'B': [4,5,6]})
df1 = pd.DataFrame({'B':[7,8,9]})
df.update(df1)
pprint(df)
0
Akash_Kumar 28 Июн 2019 в 11:20