如何将反应堆使用年份范围列转换为分年份列并填充标识值?
反应堆年份数据集转换解决方案
假设你的数据集已通过pandas加载,列名为Country、Reactor in use(启用年份,int64)、Reactor not in use(停用年份,int64),以下是实现目标格式的步骤:
1. 确定年份范围
先提取所有涉及的年份区间:
import pandas as pd min_year = df['Reactor in use'].min() max_year = df['Reactor not in use'].max() year_columns = range(min_year, max_year + 1)
2. 生成单条记录的年份标识
为每一行反应堆记录生成对应年份的激活标记(1表示该年运行):
def build_year_row(row): # 生成当前反应堆的运行年份区间 active_years = range(row['Reactor in use'], row['Reactor not in use'] + 1) # 初始化年份列,默认0,运行年份设为1 year_data = pd.Series(0, index=year_columns) year_data.loc[active_years] = 1 # 绑定国家名称 year_data['Country'] = row['Country'] return year_data # 应用函数生成初始结果 temp_df = df.apply(build_year_row, axis=1) # 调整列顺序,把Country放在最前面 temp_df = temp_df[['Country'] + list(year_columns)]
3. 合并同一国家的多条记录
如果同一国家有多个反应堆,合并后只要该年有任意反应堆运行就标记为1:
final_df = temp_df.groupby('Country').max().reset_index()
完整可运行代码
import pandas as pd # 加载并预处理数据(你已完成年份列类型转换) # df = pd.read_csv('your_dataset.csv') # df['Reactor in use'] = df['Reactor in use'].astype('int64') # df['Reactor not in use'] = df['Reactor not in use'].astype('int64') # 确定年份范围 min_year = df['Reactor in use'].min() max_year = df['Reactor not in use'].max() year_columns = range(min_year, max_year + 1) # 生成年份标记行 def build_year_row(row): active_years = range(row['Reactor in use'], row['Reactor not in use'] + 1) year_data = pd.Series(0, index=year_columns) year_data.loc[active_years] = 1 year_data['Country'] = row['Country'] return year_data temp_df = df.apply(build_year_row, axis=1) temp_df = temp_df[['Country'] + list(year_columns)] # 合并国家记录 final_df = temp_df.groupby('Country').max().reset_index() # 输出结果 print(final_df.head())
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

