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

2024-09-30 00:31:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,包含了2000-2016年的月度GDP,按州和城市进行索引。代表GDP的列的格式是“年-月”,因此例如,“2000-01”代表2000年1月。我试图按财政季度计算GDP,每个季度是相应月份GDP的平均值。你知道吗

这里是dataframe的一个片段(忽略这些值,因为它们只是示例)。你知道吗

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

Tags: 数据citydf格式代表平均值state财政
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)

我想我曾经在一个类似的问题上工作过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()))

相关问题 更多 >

    热门问题