1. まえがきとデータフォーマットの紹介
経済管理の研究では、次のようなデータ構造によく遭遇します。
名前 | 年 | 収入の種類 | 所得 |
あ | 2015年 | 投資およびウェルスマネジメント収入 | 123 |
あ | 2015年 | 給与収入 | 124 |
あ | 2015年 |
労働報酬収入 | 125 |
あ | 2015年 | その他の収益・収入 | 126 |
あ | 2016年 | 給与収入 | 213 |
あ | 2016年 | 労働報酬収入 | 214 |
あ | 2016年 | その他の収益・収入 | 521 |
あ | 2017年 | 給与収入 | 213 |
あ | 2018年 | 給与収入 | 322 |
あ | 2018年 | 労働報酬収入 | 123 |
…… | …… | ||
B | 2015年 | 投資およびウェルスマネジメント収入 | 122 |
上の表は、住民AがY年に1つの収入源から得た収入を「アンケート形式」で集計したものです(データはランダムに集計されています)。あるいは、上場企業、年度、収入区分(支出区分等)、収入(支出)等の同様のデータ形式であってもよい。さらに、次のような状況も発生する可能性があります。
名前 | 年 | 収入の種類 | 所得 |
あ | 2015年 | 投資ウェルスマネジメント収入 1 | 123 |
あ | 2015年 | 投資ウェルスマネジメント収入2 | 124 |
あ | 2015年 |
労働報酬収入1 | 125 |
.... | .... | .... | .... |
では、この種のデータをどのように処理して、名前、年、収入の種類ごとに分類された総収入を取得するにはどうすればよいでしょうか? それとも、名前、年、収入の種類に応じて固定の年間総収入のパネル データを取得しますか? 以下では Python を使用して答えます。
2. コードの紹介
以下のコードは上記の質問に対する回答であり、コードを変更することで総収入の計算や計算のための定期的な部門の再編成が実現でき、便利で高速です。もちろん、セクター分類(収入源の分類)の際に分類が困難なケースもあり、それを削除する必要があるかもしれません。次のコードでも計算が実行されます。
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)
3. さらなる処理
もちろん、最大の収入項目を取得し、それを主な収入として特定し、その他を補助的な収入源として識別する必要がある場合もあります。次のコードは、上記のコードに基づいてさらに処理することもできます。
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文件中。')