Установка вычисляемого значения для столбца для каждой группы в кадре данных - PullRequest
0 голосов
/ 09 июля 2019

У меня есть фрейм данных, где мне нужно сгруппировать по столбцу x и изменить все значения столбца a в каждой группе на вычисленное, но постоянное значение для каждой группы.

Я начинаю с такого кадра данных:

x     |   a  |   b 
------+------+-----   
a     |  -1  |  ...
b     |  -1  |  ...
c     |  -1  |  ...
a     |  -1  |  ...
b     |  -1  |  ...
c     |  -1  |  ...

и хотите преобразовать его в приведенный ниже кадр данных, сгруппировав по столбцу x и изменив столбец a на возвращение функции f

p = ["k", "l"]

def f(group_number, list):    
    return list[group_number % len(list)]

x     |   a               |   b 
------+-------------------+-----   
a     |  f(ngroup(a), p)  |  ...
b     |  f(ngroup(b), p)  |  ...
c     |  f(ngroup(c), p)  |  ...
a     |  f(ngroup(a), p)  |  ...
b     |  f(ngroup(b), p)  |  ...
c     |  f(ngroup(c), p)  |  ...

ngroup - это некоторая функция, которая делает именно то, что делает pandas.core.groupby.GroupBy.ngroup () - она ​​возвращает число для каждой группы.

Общий результат должен быть

x     |  a  |   b 
------+-----+-----   
a     |  k  |  ...
b     |  l  |  ...
c     |  k  |  ...
a     |  k  |  ...
b     |  l  |  ...
c     |  k  |  ...

, где все записи с a имеют одинаковое значение ( k ), все с b имеют значение l и все с c тоже имеют значение k .

Как мне этого добиться?

1 Ответ

1 голос
/ 09 июля 2019

То, что вы хотите сделать, это

df['a'] = p[df.groupby('x').ngroup() % len(p)]  # TypeError here

К сожалению, вы не можете напрямую транслировать список Python, так что это вызовет

TypeError: list indices must be integers or slices, not Series

Но NumPy ndarrays позволяют это, так что вы можете просто сделать:

df['a'] = np.array(p)[df.groupby('x').ngroup() % len(p)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...