WedX - журнал о программировании и компьютерных науках

Как создать новый столбец значений на основе сгруппированной суммы значений из двух других столбцов?

Во-первых, мои извинения, если мой вопрос был сформулирован не лучшим образом.

Я буду использовать образец данных, чтобы проиллюстрировать свой вопрос.

medals = pd.DataFrame({'Year':[2010,2010,2010,2010,2010,2010,2014,2014,2014,2014,2014,2014,2018,2018,2018,2018,2018,2018],'Country': ['Canada','Canada','USA','USA','Germany','Germany','Canada','Canada','USA','USA','Germany','Germany','Canada','Canada','USA','USA','Germany','Germany'],'Sex': ['female','male','female','male','female','male','female','male','female','male','female','male','female','male','female','male','female','male'],
'No. of medals': [2,4,2,0,3,0,1,1,3,2,4,4,1,3,2,2,1,3]})

Предположим, у меня есть этот кадр данных стран и количество медалей, которые они выиграли на Олимпийских играх:

    Year  Country     Sex  No. of medals
0   2010   Canada  female              2
1   2010   Canada    male              4
2   2010      USA  female              2
3   2010      USA    male              0
4   2010  Germany  female              3
5   2010  Germany    male              0
6   2014   Canada  female              1
7   2014   Canada    male              1
8   2014      USA  female              3
9   2014      USA    male              2
10  2014  Germany  female              4
11  2014  Germany    male              4
12  2018   Canada  female              1
13  2018   Canada    male              3
14  2018      USA  female              2
15  2018      USA    male              2
16  2018  Germany  female              1
17  2018  Germany    male              3 

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

    Year  Country     Sex  No. of medals  Total medals
0   2010   Canada  female              2             6
1   2010   Canada    male              4             6
2   2010      USA  female              2             2
3   2010      USA    male              0             2
4   2010  Germany  female              3             3
5   2010  Germany    male              0             3
6   2014   Canada  female              1             2
7   2014   Canada    male              1             2
8   2014      USA  female              3             5
9   2014      USA    male              2             5
10  2014  Germany  female              4             8
11  2014  Germany    male              4             8
12  2018   Canada  female              1             4
13  2018   Canada    male              3             4
14  2018      USA  female              2             4
15  2018      USA    male              2             4
16  2018  Germany  female              1             4
17  2018  Germany    male              3             4

Как мне это сделать? Я дошел до группировки по стране и году и получения суммы, но я не уверен, как сопоставить ее со столбцом «Год и страна».

medals.groupby(['Year','Country'])['No. of medals'].sum()

дает мне это:

Year  Country
2010  Canada     6
      Germany    3
      USA        2
2014  Canada     2
      Germany    8
      USA        5
2018  Canada     4
      Germany    4
      USA        4
Name: No. of medals, dtype: int64

Был бы очень признателен за любые советы и указатели. Спасибо!



Ответы:


1

Используйте groupby transform

medals['Total medals']=medals.groupby(['Country','Year'])['No. of medals'].transform('sum')
print(medals)




  Year  Country     Sex  No. of medals  Total medals
0   2010   Canada  female              2             6
1   2010   Canada    male              4             6
2   2010      USA  female              2             2
3   2010      USA    male              0             2
4   2010  Germany  female              3             3
5   2010  Germany    male              0             3
6   2014   Canada  female              1             2
7   2014   Canada    male              1             2
8   2014      USA  female              3             5
9   2014      USA    male              2             5
10  2014  Germany  female              4             8
11  2014  Germany    male              4             8
12  2018   Canada  female              1             4
13  2018   Canada    male              3             4
14  2018      USA  female              2             4
15  2018      USA    male              2             4
16  2018  Germany  female              1             4
17  2018  Germany    male              3             4
07.08.2020
  • Большое спасибо! Это помогло. После быстрого поиска функции преобразования это дало мне хорошее объяснение ссылка на случай, если кому-то еще интересно . 08.08.2020

  • 2

    Ты почти понял.

    >>> medals_sum = medals.groupby(["Year", "Country"])["No. of medals"].sum().reset_index()
    >>> medals_sum = medals_sum.rename(columns={"No. of medals": "Total medals"})
    >>> medals.merge(medals_sum, on=["Year", "Country"])
    
        Year  Country     Sex  No. of medals  Total medals
    0   2010   Canada  female              2             6
    1   2010   Canada    male              4             6
    2   2010      USA  female              2             2
    3   2010      USA    male              0             2
    4   2010  Germany  female              3             3
    5   2010  Germany    male              0             3
    6   2014   Canada  female              1             2
    7   2014   Canada    male              1             2
    8   2014      USA  female              3             5
    9   2014      USA    male              2             5
    10  2014  Germany  female              4             8
    11  2014  Germany    male              4             8
    12  2018   Canada  female              1             4
    13  2018   Canada    male              3             4
    14  2018      USA  female              2             4
    15  2018      USA    male              2             4
    16  2018  Germany  female              1             4
    17  2018  Germany    male              3             4
    
    07.08.2020
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]