【问题标题】:Creating a Function with multiple operations in Python在 Python 中创建具有多个操作的函数
【发布时间】:2019-04-14 14:26:40
【问题描述】:

我目前正在做一个包含婴儿姓名数据的项目。我正在研究从 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)的总数相加吗?

【问题讨论】:

  • 数据集的结构?有样本数据吗?
  • 函数的所有行都必须缩进。
  • 数据为5列(姓名、性别、年份、数字、比例)..超过一百万行,所以我想将其转换为宽数据框

标签: python pandas dataframe


【解决方案1】:

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

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

Sample data

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

Sample data 对其进行了测试

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)

【讨论】:

  • 但是,如果我这样做,我将每十年都这样做。我正在尝试创建一种通用方法,以便当我专门使用 1950 年代的数据集时,我可以运行该方法来获取顶级名称。
  • 啊,我误读了关于数据集已按十年和性别划分的部分。将在几分钟内更新我的答案。
  • 可以通过使用df.groupby('name', as_index=False).nlargest(1, 'number')来摆脱这里的排序,这在功能上是等效的,但没有排序......
  • @JonClements:谢谢!我已经相应地更新了答案。
  • 我想我不清楚。我的数据全部按十年排序,但我想要一种进一步排序的方法(通过创建一个包含每一年总数的新列。
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
相关资源
最近更新 更多