Pandas Groupby和基于列名的sum

Pandas Groupby和基于列名的sum,pandas,columnheader,Pandas,Columnheader,我有一个数据帧: df = pd.DataFrame({ 'BU': ['AA', 'AA', 'AA', 'BB', 'BB', 'BB'], 'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'], '201901': [100, 120, 130, 200, 190, 210], '201902': [100, 120, 130, 200, 190, 210],

我有一个数据帧:

df = pd.DataFrame({ 
    'BU': ['AA', 'AA', 'AA', 'BB', 'BB', 'BB'], 
    'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'],
    '201901': [100, 120, 130, 200, 190, 210],
    '201902': [100, 120, 130, 200, 190, 210],
    '201903': [200, 250, 450, 120, 180, 190],
    '202001': [200, 250, 450, 120, 180, 190],
    '202002': [200, 250, 450, 120, 180, 190],
    '202003': [200, 250, 450, 120, 180, 190]
})
这些列分别表示年和月。我想把几个月的栏目汇总成一个新的年度栏目。结果应如下所示:

df = pd.DataFrame({ 
    'BU': ['AA', 'AA', 'AA', 'BB', 'BB', 'BB'], 
    'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'],
    '201901': [100, 120, 130, 200, 190, 210],
    '201902': [100, 120, 130, 200, 190, 210],
    '201903': [200, 250, 450, 120, 180, 190],
    '202001': [200, 250, 450, 120, 180, 190],
    '202002': [200, 250, 450, 120, 180, 190],
    '202003': [200, 250, 450, 120, 180, 190],
    '2019': [400, 490, 710, 520, 560, 610],
    '2020': [600, 750, 1350, 360, 540, 570]
})

我的实际数据集有若干年,每年有12个月。希望不必手动添加列。

列的总和是否总是相同的?也就是说,是否总是有3个
2019
列具有相同的名称,以及3个
2020
列具有相同的名称?如果是这样,您可以对这些新列进行硬编码

df['2019']=df['201901']+df['201902']+df['201903']
df['2020']=df['202001']+df['202002']+df['202003']

您求和的列是否总是相同的?也就是说,是否总是有3个
2019
列具有相同的名称,以及3个
2020
列具有相同的名称?如果是这样,您可以对这些新列进行硬编码

df['2019']=df['201901']+df['201902']+df['201903']
df['2020']=df['202001']+df['202002']+df['202003']

尝试创建包含年份列的数据框,并转换列名:

按年份列出的列和仅列出年份值的列:

data_df = (
    data_df.resample('Y', axis=1).sum().rename(columns=lambda c: c.year)
)
然后返回到原始数据帧:

new_df = df.join(data_df)
new_df

   BU Line_Item  201901  201902  201903  202001  202002  202003  2019  2020
0  AA  Revenues     100     100     200     200     200     200   400   600
1  AA       EBT     120     120     250     250     250     250   490   750
2  AA  Expenses     130     130     450     450     450     450   710  1350
3  BB  Revenues     200     200     120     120     120     120   520   360
4  BB       EBT     190     190     180     180     180     180   560   540
5  BB  Expenses     210     210     190     190     190     190   610   570

尝试创建包含年份列的数据框,并转换列名:

按年份列出的列和仅列出年份值的列:

data_df = (
    data_df.resample('Y', axis=1).sum().rename(columns=lambda c: c.year)
)
然后返回到原始数据帧:

new_df = df.join(data_df)
new_df

   BU Line_Item  201901  201902  201903  202001  202002  202003  2019  2020
0  AA  Revenues     100     100     200     200     200     200   400   600
1  AA       EBT     120     120     250     250     250     250   490   750
2  AA  Expenses     130     130     450     450     450     450   710  1350
3  BB  Revenues     200     200     120     120     120     120   520   360
4  BB       EBT     190     190     180     180     180     180   560   540
5  BB  Expenses     210     210     190     190     190     190   610   570

谢谢我的实际数据集相当大,有很多年,每年12个月。希望避免手动相加,谢谢。我的实际数据集相当大,有很多年,每年12个月。希望避免手动相加“
df.assign
似乎无法对列求和”意味着什么?它什么都没用?抛出错误(如果是,则发布回溯)?创建列,但结果错误?请发布您尝试过的代码,并解释为什么它不起作用。谢谢您的反馈。我将在稍后发布回溯。什么是“
df.assign
似乎无法对列求和”的意思?它什么都没用?抛出错误(如果是,则发布回溯)?创建列,但结果错误?请发布您尝试过的代码,并解释为什么它不起作用。谢谢您的反馈。我将在稍后发布一个回溯。