我目前正在做一个带有婴儿名字数据的项目。我正在研究从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]
关于如何实现此目标的任何建议?
当前为长格式。我可以创建一个中间函数,将其转换为宽格式并建立一个新列,将每年(1960、1961,... 1969)的总数相加吗?
答案 0 :(得分:1)
问题1-每年n最高的名称
df.groupby(by='name', as_index=False)
.count()
.nlargest(1, 'number')
.iloc[0]["name"]
问题2-将数据转换为宽格式
Sample data经过测试的
pandas中的枢轴不进行聚合。因此,我分解了获取每年总数和每十年总数的步骤。最后,我加入了这两个以获得预期的结果:
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)