2016-12-24 5 views
2

Я пытаюсь создать общий столбец, который суммирует числа из другого столбца на основе третьего столбца. Я могу сделать это, используя .groupby(), но это создает усеченный столбец, тогда как я хочу, чтобы столбец имел одинаковую длину.Pandas - создать общий столбец на основе другого столбца

Мой код:

df = pd.DataFrame({'a':[1,2,2,3,3,3], 'b':[1,2,3,4,5,6]}) 
df['total'] = df.groupby(['a']).sum().reset_index()['b'] 

Мой результат:

a b total 
0 1 1 1.0 
1 2 2 5.0 
2 2 3 15.0 
3 3 4 NaN 
4 3 5 NaN 
5 3 6 NaN 

Мой желаемый результат:

a b total 
0 1 1 1.0 
1 2 2 5.0 
2 2 3 5.0 
3 3 4 15.0 
4 3 5 15.0 
5 3 6 15.0 

... где каждый 'a' столбец имеет ту же сумму, как и другие.

ответ

5

Возврат суммы из групповой операции в pandas создает столбец только до тех пор, пока количество уникальных элементов в индексе. Используйте transform, чтобы создать столбец той же длины («как индексированный») в качестве исходного кадра данных без каких-либо слияний.

df['total'] = df.groupby('a')['b'].transform(sum) 
>>> df 
    a b total 
0 1 1  1 
1 2 2  5 
2 2 3  5 
3 3 4  15 
4 3 5  15 
5 3 6  15 
+0

не совсем уверен, почему, но это работает как шарм. Спасибо! – pshep123

+0

Рад, что это работает для вас! Документация (просто добавила ссылку на нее в моем ответе) говорит, что 'transform' создает столбец« как индексированный »в исходный фрейм данных. Это означает, что он имеет ту же длину, что и исходный кадр данных, и это не только уникальные элементы индекса. – 3novak

Смежные вопросы