Python Pandas Обновляет столбец Dataframe со значением на основе столбца в другом Dataframe с перекрывающимися индексами - PullRequest
0 голосов
/ 27 ноября 2018

Возможно, это простой ответ, но почему-то я его не вижу.

У меня есть два кадра данных df_a и df_b.df_b.index является подмножеством df_a.index.

df_a

              Actioncode   Group

    Mary         1.0         I
    Paul         1.0         I
    Robert       4.0         O
    David        4.0         O
    Julia        4.0         O

Обратите внимание, что Group относится к ActionCode (Просто делает код действия читабельным.

df_b

              Group

    Paul        O
    Robert      I

Что я хочуdf_a Actioncode для отображения 5.0, если имя в df_b и Group для «O», и df_a Actioncode для отображения 3.0, если имя в df_b и Group в »I '.

Таким образом, результат будет:

    df_a

              Actioncode   Group

    Mary         1.0         I
    Paul         5.0         I
    Robert       3.0         O
    David        4.0         O
    Julia        4.0         O

Я пробовал where, но не могу его получить.

df_a['Actioncode'] =  df_a['Actioncode'].where(df_b['Group'] == 'O', 5.0)

Ноэто не совсем правильно.

Я могу повторить, но это не пифоник.

Insights?

Спасибо,

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Другой вариант с np.where и отображением.

scores = pd.Series(df_a.index).map(df_b['Group'].map({'O': 5.0, 'I': 3.0}))
df_a['Actioncode'] = np.where(scores.isnull(), df_a['Actioncode'], scores)

Подробности:

>>> df_a
        Actioncode Group
Mary           1.0     I
Paul           1.0     I
Robert         4.0     O
David          4.0     O
Julia          4.0     O
>>> scores = pd.Series(df_a.index).map(df_b['Group'].map({'O': 5.0, 'I': 3.0}))
>>> scores
0    NaN
1    5.0
2    3.0
3    NaN
4    NaN
dtype: float64
>>> 
>>> where = np.where(scores.isnull(), df_a['Actioncode'], scores)
>>> where
array([1., 5., 3., 4., 4.])
>>>
>>> df_a['Actioncode'] = where
>>> df_a
        Actioncode Group
Mary           1.0     I
Paul           5.0     I
Robert         3.0     O
David          4.0     O
Julia          4.0     O
0 голосов
/ 27 ноября 2018

Для этого вы можете использовать np.select, который работает как np.where, но с несколькими условиями / выходами:

# Transform index of df_a to series for mapping
a_idx = df_a.index.to_series()

# Condition that df_a's index is in df_b
idx_in = a_idx.isin(df_b.index)

# map df_a's index to the df_b groups
mapped = a_idx.map(df_b.Group)

# apply np.select on your conditions:
conds = [(idx_in) & (mapped == 'O'),
         (idx_in) & (mapped == 'I')]

choices = [5,3]


df_a['Actioncode'] = np.select(conds,choices, df_a.Actioncode)

>>> df_a
        Actioncode Group
Mary           1.0     I
Paul           5.0     I
Robert         3.0     O
David          4.0     O
Julia          4.0     O
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...