在Python中创建具有多个操作的函数

在Python中创建具有多个操作的函数,python,pandas,dataframe,Python,Pandas,Dataframe,我目前正在做一个关于婴儿名字数据的项目。从20世纪50年代开始,每十年我都会看到最流行的男性和女性婴儿名字。我正在尝试创建一个函数,该函数将打印出我输入的数据集的顶级名称 到目前为止,我已经成功地为每十年创建了两个数据集(一个是男性,另一个是女性) 这是我的函数代码,但我似乎不知道如何使它工作 def getTopName(data): (data .drop(columns =['sex', 'prop']) .pivot(index = 'name',

我目前正在做一个关于婴儿名字数据的项目。从20世纪50年代开始,每十年我都会看到最流行的男性和女性婴儿名字。我正在尝试创建一个函数,该函数将打印出我输入的数据集的顶级名称

到目前为止,我已经成功地为每十年创建了两个数据集(一个是男性,另一个是女性)

这是我的函数代码,但我似乎不知道如何使它工作

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]
关于如何做到这一点有什么建议吗

我的数据如下所示:


它目前是长格式的。我是否可以创建一个中间函数,将其转换为广泛形式,并构建一个新列,其中可以将每年(1960年、1961年、1969年)的总数相加?

问题1-每年n数最高的名称

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

问题2-将数据转换为宽格式

这是在它上面测试的

pandas中的Pivot不进行聚合。因此,我将获得每年总数和每十年总数的步骤分开。最后,我将这两种方法结合起来,以获得所需的结果:

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)

数据集的结构?任何示例数据?函数的所有行都必须缩进。数据为5列(名称、性别、年份、数字和比例)。。有超过一百万行,这就是为什么我想把它转换成一个广泛的数据框架,但如果我这样做的话,我仍然要每十年做一次。我正在尝试创建一种通用方法,这样当我特别使用1950年代的数据集时,我就可以运行该方法来获得顶级名称。啊,我误读了关于数据集已按十年和性别划分的区别。将在几分钟内更新我的答案。可以通过使用
df.groupby('name',as_index=False)在此处取消排序。nlargest(1,'number')
,这在功能上是等效的,但没有排序…@JonClements:谢谢!我已经相应地更新了答案。我想我不清楚。我的数据都是按十年排序的,但我希望有一种方法可以对其进行进一步排序(通过创建一个新列,其中包含每一年的总数)。