Создание функции с несколькими операциями в Python - PullRequest
0 голосов
/ 11 ноября 2018

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

До сих пор я успешно создал два набора данных для каждого десятилетия (один мужской и другой женский)

Это код, который у меня есть для функции, но я не могу понять, как заставить ее работать ...

def getTopName(data):
    (data
        .drop(columns =['sex', 'prop'])
        .pivot(index = 'name', columns = 'year', values = 'n')
        .sum(axis=1) = data['decade']
        .sort_values(by = 'decade', ascending = False))
    print data[0:1]

Есть предложения о том, как этого добиться?

Мои данные выглядят так: my data

В настоящее время в длинном формате.Могу ли я создать среднюю функцию, которая преобразует ее в широкую форму и создает новый столбец, в который можно суммировать итоги за каждый год (1960, 1961, ... 1969)?

1 Ответ

0 голосов
/ 11 ноября 2018

Вопрос 1 - Имя с наибольшим n в год

df.groupby(by='name', as_index=False)
      .count()
      .nlargest(1, 'number')
      .iloc[0]["name"]

Пример данных

Вопрос 2 - преобразование данных в широкую форму

Пример данных , на которых это было проверено

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

import pandas as pd

df = pd.read_csv('set2.csv')

# add decade column
df["decade"] = df["year"] - (df["year"] % 10)

# add decade_title column to prevent join clashes
df["decade_total"] = df["decade"]
                       .apply(lambda decade_num: f"{str(decade_num)}_total")

# first pivot with n per year
per_year_df = df.pivot(index="name", columns="year", values="n")

# pivot cannot aggregate so we first aggregate and then pivot
per_decade_df = df\
    .groupby(by=["decade_total", "name"], as_index=False)\
    .agg({"n": 'sum'})\
    .pivot(index="name", columns="decade_total", values="n")

# finally we join the decade totals to the yearly counts
joined_df = per_year_df.join(per_decade_df)

Joined result table

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...