如何根据条件复制Pandas DataFrame行并修改指定列值
武装冲突数据集时间拆分处理方案
数据集情况
我有一份CSV格式的武装冲突数据集,记录不同实体(国家、政权、派系,用大写字母A、B等表示)之间的冲突信息:
Start_Year:冲突开始年份End_Year:冲突结束年份Opp1/Opp2:冲突双方的实体列表Duration:冲突持续时长,由End_Year - Start_Year计算得到
原始数据示例:
Start_Year End_Year Opp1 Opp2 Duration 1500 1501 ['A','B'] ['C','D'] 1 1500 1510 ['P','Q','R'] ['X','Y'] 10 1520 1520 ['A','X'] ['C'] 0 ... .... ........ ..... .. 1809 1820 ['M'] ['F','H','Z'] 11
处理需求
需要对数据做以下拆分处理:
- 对
Duration > 0的行,按照Duration的值复制对应次数的行(比如Duration=6就复制6次) - 复制出来的行中,
Start_Year逐次加1,Duration逐次减1,其他列保持不变 - 最终每个冲突都要包含到
End_Year的行(即Duration=0的行),比如原Duration=1的行,处理后会得到2行(原行+Start_Year+1、Duration=0的行)
期望输出示例:
Start_Year End_Year Opp1 Opp2 Duration 1500 1501 ['A','B'] ['C','D'] 1 1501 1501 ['A','B'] ['C','D'] 0 1500 1510 ['P','Q','R'] ['X','Y'] 10 1501 1510 ['P','Q','R'] ['X','Y'] 9 1502 1510 ['P','Q','R'] ['X','Y'] 8 1503 1510 ['P','Q','R'] ['X','Y'] 7 1504 1510 ['P','Q','R'] ['X','Y'] 6 1505 1510 ['P','Q','R'] ['X','Y'] 5 .... .... ............. ........ .. 1510 1510 ['P','Q','R'] ['X','Y'] 0 1520 1520 ['A','X'] ['C'] 0 ... .... ........ ..... .. 1809 1820 ['M'] ['F','H','Z'] 11 1810 1820 ['M'] ['F','H','Z'] 10 .... .... ..... .............. .. 1820 1820 ['M'] ['F','H','Z'] 0
实现步骤(Python pandas)
作为数据科学新手,用pandas可以快速实现这个需求,步骤如下:
- 安装并导入pandas:
# 未安装pandas先执行:pip install pandas import pandas as pd
- 读取CSV文件:
df = pd.read_csv('your_dataset.csv') # 若CSV列名含空格,可指定sep='\s+'适配,这里假设列名与示例一致
- 定义单行处理函数,生成拆分后的所有行:
def split_row(row): duration = row['Duration'] # Duration为0时直接返回原行 if duration == 0: return [row.to_dict()] # 生成从原始年份到结束年份的所有行 rows = [] for i in range(duration + 1): new_row = row.copy() new_row['Start_Year'] = row['Start_Year'] + i new_row['Duration'] = duration - i rows.append(new_row.to_dict()) return rows
- 应用函数并展开所有行:
# 对每行应用拆分函数,再展开嵌套列表 expanded_rows = df.apply(split_row, axis=1).explode() # 将字典列表转换为DataFrame result_df = pd.DataFrame(expanded_rows.tolist())
- 重置索引并保存结果:
result_df = result_df.reset_index(drop=True) # 保存到新CSV文件 result_df.to_csv('split_conflicts.csv', index=False)
这个逻辑会自动处理所有行:Duration=0的行保留原样,Duration>0的行生成从起始年份到结束年份的所有对应行,Duration从原始值递减到0,完全匹配需求。
内容的提问来源于stack exchange,提问作者Aalekh Roy
相关产品推荐
相关产品推荐

