【问题标题】:How to create a new column from a subset of other existing columns?如何从其他现有列的子集创建新列?
【发布时间】:2019-10-05 11:52:34
【问题描述】:

我有一个数据集,其中包含 2000 年至 2016 年的月度 GDP,按州和市编制索引。代表 GDP 的列按“年月”格式,例如,“2000-01”代表 2000 年 1 月。我试图按财政季度获取 GDP,其中每个季度是相应月份 GDP 的平均值。

这是数据帧的 sn-p(忽略这些值,因为它们仅用于示例)。

State    City        2000-01   2000-02   2000-03   2000-04   2000-05   2000-06 
Alabama  Adamsville  1000      1005      1020      1119      1125      1000
Alabama  Alabaster   1093      1312      1542      1624      1134      1953
Alabama  Axis        18324     98174     14047     27343     43234     12434

我的预期输出如下(同样,这些值是组成的)。例如,2000q1 是 2000-01、2000-02 和 2000-03 列的平均值。

State    City        2000q1   2000q2 
Alabama  Adamsville  1010     1006
Alabama  Alabaster   1100     1750
Alabama  Axis        15673    19849

我尝试了几种不同的方法,最值得注意的是:

由于输出数据帧将有 64 个不同的季度,因此对每个季度执行以下操作是低效的:

df['2000q1']=df[['2000-01', '2000-02', '2000-03']].mean(axis=1)

在另一次尝试中,我更改了所有列名以表示它们应该分开的季度,从而为每个季度生成三个相同的列名(但不是基础数据),如下所示。因为列名是相同的,所以我很难找到每三个相同列名的平均值。

State    City        2000q1    2000q1    2000q1    2000q2    2000q2    2000q2 
Alabama  Adamsville  1000      1005      1020      1119      1125      1000
Alabama  Alabaster   1093      1312      1542      1624      1134      1953
Alabama  Axis        18324     98174     14047     27343     43234     12434

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我想我曾经在 Coursera.com 上研究过类似的问题。你可以试试这个(假设你的数据框的名字是'df'):

    df = (df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1).mean())
    

    您将获得类似“2000Q1”的列名。如果您想获得名称为“2000q1”,可以尝试以下操作:

    df = (df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1).mean().rename(columns=lambda c: str(c).lower()))
    

    【讨论】:

      【解决方案2】:

      假设您的数据框为df

      data = df.iloc[:,2:]
      predf = df.iloc[:,:2]
      colnums = [i for i in range(0,len(data.columns),3)]
      newdf = pd.DataFrame()
      for idx,val in enumerate(colnums):
          name = data.columns[idx].split("-")[0]
          colname = f"{name}-q{idx+1}"
          newdf[colname] = data.iloc[:,val:(val+2)].mean(axis=1)
      
      output = pd.concat([predf,newdf],axis=1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-04
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多