Запуск через Groupby с разными словарями {key: value} - PullRequest
1 голос
/ 07 октября 2019

В следующем коде:

import pandas as pd
import numpy as np
import random

sz = 50
df = pd.DataFrame({'Group': pd.Series(random.choice(['A', 'B']) for _ in range(sz)),
              'Key': pd.Series(np.random.randint(2, high=5, size=sz))})

dictforA = {2: 0.1, 3: 0.8, 4: 0.2}
dictforB = {3: 0.9}

... хотите назначить новый столбец с именем Value, который основан на соответствующем словаре. Недостающие значения будут NaN.

Код: df.assign(Value=df.groupby('Group').apply(lambda x: np.where(x.index == 'A', dictforA[x.Key], dictforB[x.Key])))

дает

TypeError: 'Series' objects are mutable, thus they cannot be hashed

Куда я иду не так?

1 Ответ

6 голосов
/ 07 октября 2019

Вы можете создать маппер из группы в свои словари и использовать pd.Series.map

mapper = {'A': dictforA, 
          'B': dictforB}

df['Value'] = df.groupby('Group').Key.apply(lambda s: s.map(mapper[s.name]))

>>> print(df.head(10))

  Group  Key  Value
0     B    3    0.9
1     A    2    0.1
2     B    3    0.9
3     A    3    0.8
4     A    3    0.8
5     A    2    0.1
6     B    2    NaN
7     B    2    NaN
8     A    4    0.2
9     A    2    0.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...