Конвертировать Pandas GroupBy в DataFrame - PullRequest
0 голосов
/ 08 мая 2018

У меня есть следующий фрейм данных table_1:

     Sample  method       value
3   sample1  method_0     1
3   sample1  method_1     2
3   sample1  method_2     3
3   sample1  method_3     4
3   sample2  method_0     5
3   sample2  method_1     6
3   sample2  method_2     7
3   sample2  method_3     8


grouped = table_1.groupby('method')

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

table_2 = grouped.apply(lambda x: x['value'].div(series_of_two_elements))

Но теперь я хочу объединить table_2 в каждую группу в table_1. Когда я пытаюсь:

table_1['normalized'] = table_2

Я получаю:

TypeError: 'DataFrameGroupBy' object does not support item assignment

Как я могу преобразовать table_1 обратно в DataFrame, чтобы я мог назначить эти новые нормализованные значения для каждой группы? Могу ли я использовать лямбда-выражение с df.transform?

1 Ответ

0 голосов
/ 08 мая 2018

Я думаю, нужно GroupBy.transform и для Series добавить .values для массива numpy во избежание выравнивания:

series_of_two_elements = pd.Series([1,2])

grouped = table_1.groupby('method')
table_2 = grouped['value'].transform(lambda x: x.div(series_of_two_elements.values))
table_1['normalized'] = table_2

print (table_1)
    Sample    method  value  normalized
3  sample1  method_0      1         1.0
3  sample1  method_1      2         2.0
3  sample1  method_2      3         3.0
3  sample1  method_3      4         4.0
3  sample2  method_0      5         2.5
3  sample2  method_1      6         3.0
3  sample2  method_2      7         3.5
3  sample2  method_3      8         4.0

Другое возможное решение - создать MultiIndex со вторым уровнем на cumcount, а затем использовать div на втором уровне (Series называется series_of_two_elements, должно быть с одинаковыми значениями индекса, такими как second level для каждой группы):

series_of_two_elements = pd.Series([1,2])

table_1 = table_1.set_index(['method', table_1.groupby('method').cumcount()])
table_1['normalized'] = table_1['value'].div(series_of_two_elements, level=1)
print (table_1)
             Sample  value  normalized
method                                
method_0 0  sample1      1         1.0
method_1 0  sample1      2         2.0
method_2 0  sample1      3         3.0
method_3 0  sample1      4         4.0
method_0 1  sample2      5         2.5
method_1 1  sample2      6         3.0
method_2 1  sample2      7         3.5
method_3 1  sample2      8         4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...