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

如何在Pandas中从data1生成含start/end交叉项的data2?

如何从data生成data2:生成start与end的交叉项并匹配values值

需求说明

将原DataFrame中start、end列的空格分隔字符串拆分为单个元素,生成两者的笛卡尔积组合,同时将values列的空格分隔数值按顺序分配给每个交叉项,最终得到目标格式的DataFrame。

解决方案

可以通过对每一行数据进行拆分、生成交叉组合、匹配数值这三个步骤实现,以下是两种可行的实现方式:

方法一:嵌套循环生成交叉项

import pandas as pd

# 原数据
data = pd.DataFrame([['EU', ('a b'), ('d e'), ('1 2 3 4')],
                     ['NA', ('g h i'), ('j k l'), ('11 12 13 14 15 16 17 18 19')]],
                    columns=['region', 'start', 'end', 'values'])

def process_row(row):
    # 拆分各列的空格分隔内容,values转为整数类型
    starts = row['start'].split()
    ends = row['end'].split()
    values = list(map(int, row['values'].split()))
    
    # 遍历start和end的所有组合,匹配对应values
    records = []
    val_idx = 0
    for s in starts:
        for e in ends:
            records.append([row['region'], s, e, values[val_idx]])
            val_idx += 1
    return pd.DataFrame(records, columns=data.columns)

# 处理所有行并合并结果
data2 = pd.concat(data.apply(process_row, axis=1).tolist(), ignore_index=True)
print(data2)

方法二:使用itertools.product生成笛卡尔积(更简洁)

import pandas as pd
from itertools import product

# 原数据
data = pd.DataFrame([['EU', ('a b'), ('d e'), ('1 2 3 4')],
                     ['NA', ('g h i'), ('j k l'), ('11 12 13 14 15 16 17 18 19')]],
                    columns=['region', 'start', 'end', 'values'])

def process_row(row):
    starts = row['start'].split()
    ends = row['end'].split()
    values = list(map(int, row['values'].split()))
    
    # 生成start和end的笛卡尔积
    cross_combinations = list(product(starts, ends))
    
    # 构建结果DataFrame
    return pd.DataFrame({
        'region': [row['region']]*len(cross_combinations),
        'start': [item[0] for item in cross_combinations],
        'end': [item[1] for item in cross_combinations],
        'values': values
    })

# 合并所有行的处理结果
data2 = pd.concat(data.apply(process_row, axis=1).tolist(), ignore_index=True)
print(data2)

代码说明

  1. 拆分列内容:使用split()方法将空格分隔的字符串拆分为列表,values列额外通过map(int, ...)转换为整数类型。
  2. 生成交叉项:两种方法分别通过嵌套循环或itertools.product生成start和end元素的所有组合,确保覆盖所有交叉项。
  3. 匹配数值:按照交叉项的生成顺序,依次从values列表中取出对应数值,保证每个交叉项分配正确的数值。
  4. 合并结果:用pd.concat将每行处理得到的小DataFrame合并为最终的data2,并通过ignore_index=True重置索引。

内容的提问来源于stack exchange,提问作者xinxin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:25:25