[数据处理-经济管理]如何使用Python对数据进行分组运算?

一、前言与数据格式介绍

        在经济管理的研究中,常常会遇见这样一种数据结构:

Name Year IncomeType Income
A 2015 投资理财收入 123
A 2015 工资薪金收入 124
A

2015

劳动报酬收入 125
A 2015 其他收入 126
A 2016 工资薪金收入 213
A 2016 劳动报酬收入 214
A 2016 其他收入 521
A 2017 工资薪金收入 213
A 2018 工资薪金收入 322
A 2018 劳动报酬收入 123
....... .......
B 2015 投资理财收入 122

        上述表格是以“问卷形式”中有关问卷中收集到的居民A在Y年I种收入来源取得的收入(数据随意编的)。或者还有可能是上市公司、年份、收入类别(费用类别等)、收入(费用),这种类似的数据形式。更有甚者,可能还会出现这种情况:

Name Year IncomeType Income
A 2015 投资理财收入1 123
A 2015 投资理财收入2 124
A

2015

劳动报酬收入1 125
.... .... .... ....

       那么,如何处理这类数据,得到按照Name、Year、Incometype三重固定归类的总收入情况呢?或者得到按照Name、Year、Incometype固定得到年度总收入的面板数据呢?下面我会用Python进行解答:

二、代码介绍

       下面的代码给予上述问题回复,改代码可以实现对总收入进行计算,并对部门进行规整重组进行运算,方便快捷。当然,有可能遇到在部门分类(收入来源分类)时碰见一些难以分类的情况,我们可能需要将其剔除。下述代码也进行了计算。

import pandas as pd

# 读取Excel数据
df = pd.read_excel(".xlsx", engine='openpyxl')
print(df['revenue'].apply(type).value_counts())

import pandas as pd

# 对公司、年份和部门进行分组加总
grouped_df = df.groupby(['code', 'stkcd' ,'year', 'Sectors'])['revenue'].sum().reset_index()

# 计算每个公司每年所有部门的总收入
total_income = df.groupby(['code', 'stkcd' ,'year'])['revenue'].sum().reset_index()
total_income.columns = ['code', 'stkcd' ,'year', '公司年度总收入']

# 计算剔除"不便于分类"部门后,每个公司每年所有部门的总收入
df_without_unclassified = df[df['Sectors'] != '不便于分类']
total_income_without_unclassified = df_without_unclassified.groupby(['code', 'stkcd' ,'year'])['revenue'].sum().reset_index()
total_income_without_unclassified.columns = ['code', 'stkcd' ,'year', '剔除不便于分类后公司年度总收入']

# 将总收入和剔除"不便于分类"部门后的总收入合并到原始数据集
final_df = pd.merge(grouped_df, total_income, on=['code', 'stkcd' ,'year'])
final_df = pd.merge(final_df, total_income_without_unclassified, on=['code', 'stkcd' ,'year'], how='left')

# 保存到新的Excel文件
final_df.to_excel(".xlsx", index=False)

三、进一步处理

        当然,我们还可能需要得到最大收入项目,将其标识为主要收入,其他的作为辅助收入来源,下述代码也可以在上述代码基础上进一步实现处理规整。

import pandas as pd

df = pd.read_excel(".xlsx", sheet_name='')

# 对数据进行分组并获取每个组的最大收入
grouped = df.groupby(['公司', '年度'])
max_revenues = grouped['收入'].max()

# 获取每个组收入最大的部门
max_department_indexes = df.groupby(['公司', '年度'])['收入'].idxmax()
max_departments = df.loc[max_department_indexes, '部门']

# 将每个公司、年份的主要部门设置为'Main_industry',其他部门设置为'Sup_industry'
df['部门类型'] = 'Sup_industry'
for i in range(len(max_departments)):
    df.loc[(df['公司'] == max_revenues.index[i][0]) & (df['年度'] == max_revenues.index[i][1]) & (df['部门'] == max_departments.loc[max_department_indexes[i]]), '部门类型'] = 'Main_industry'

# 将结果输出到一个新的Excel文件
with pd.ExcelWriter(".xlsx") as writer:
    df.to_excel(writer, index=False)

# 输出完成消息
print('结果已输出到result.xlsx文件中。')

猜你喜欢

转载自blog.csdn.net/m0_56120502/article/details/130537454