如何从其他现有列的子集中创建一个新列?

时间:2019-10-05 03:02:27

标签: python pandas

我有一个数据集,其中包含2000-2016年的每月GDP(按州和城市索引)。代表GDP的列以“年-月”格式表示,因此,例如,“ 2000-01”代表2000年1月。我试图按财政季度获得GDP,其中每个季度都是相应月份GDP的平均值。 / 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

2 个答案:

答案 0 :(得分: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()))

答案 1 :(得分:0)

假设您的数据框为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)