Поведение .groupby и .transform – несоответствие длиныPython

Программы на Python
Ответить
Anonymous
 Поведение .groupby и .transform – несоответствие длины

Сообщение Anonymous »

Я экспериментировал с pandas для анализа данных, однако столкнулся с проблемой при работе с .groupby() и .transform() .
Пусть это будет фрейм данных:

Код: Выделить всё

df = pd.DataFrame({
'group': ['x','x','x','y','y','z'],
'b':     [1, 2, 1, 3, 3, 4]
})


group
b




x
1


x
2


x
1


y
3


y
3


z
4



Я хотел создать столбец «c», который собирает в список все уникальные значения из столбца «b» для каждой группы в результате получается следующее:



group
b
c




x
1
1,2 (в виде списка)


x
2
1,2 (в виде списка)


x
1
1,2 (в виде список)


y
3
3 (как список из 1 элемента)


y
3
3 (как список из 1 элемента)


z
4
4 (как список из 1 элемента)



Для этого я подумал об использовании .groupby('group')['b'].transform(). Я решил сделать это, потому что так я могу применить выбранное значение ко всей группе. Например, этот код может создать следующий фрейм данных:

Код: Выделить всё

df['c'] = df.groupby(['group'])['b'].transform('first')


group
b
c




x
1
1


x
2
1


x
1
1


y
3
3


y
3
3


z
4
4



Вернувшись к моей проблеме, я пробую эту строку, и она выдает следующую ошибку:

Код: Выделить всё

df['c'] = df.groupby(['group'])['b'].transform(lambda x: np.unique(x.astype(str)))
ValueError: Length of values (2) does not match length of index (3)
Интересно, что вместо этого работает эта строка кода:

Код: Выделить всё

df['c'] = df.groupby(['group'])['b'].transform(lambda x: ','.join(np.unique(x.astype(str))))
выход:



group
b
c




x
1
'1,2'


x
2
'1,2'


x
1
'1,2'


y
3
'3'


y
3
'3'


z
4
'4'



Я думаю, что смогу найти обходной путь, используя .agg() и .map(), возможно, но мне интересно узнать, что я делаю не так с SeriesGroupBy
Может кто-нибудь объяснить мне, почему это не работает с моим кодом? Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/798 ... h-mismatch
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»