You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据条件复制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可以快速实现这个需求,步骤如下:

  1. 安装并导入pandas:
# 未安装pandas先执行:pip install pandas
import pandas as pd
  1. 读取CSV文件:
df = pd.read_csv('your_dataset.csv')
# 若CSV列名含空格,可指定sep='\s+'适配,这里假设列名与示例一致
  1. 定义单行处理函数,生成拆分后的所有行:
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
  1. 应用函数并展开所有行:
# 对每行应用拆分函数,再展开嵌套列表
expanded_rows = df.apply(split_row, axis=1).explode()
# 将字典列表转换为DataFrame
result_df = pd.DataFrame(expanded_rows.tolist())
  1. 重置索引并保存结果:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:45:33