如何在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)
代码说明
- 拆分列内容:使用
split()方法将空格分隔的字符串拆分为列表,values列额外通过map(int, ...)转换为整数类型。 - 生成交叉项:两种方法分别通过嵌套循环或
itertools.product生成start和end元素的所有组合,确保覆盖所有交叉项。 - 匹配数值:按照交叉项的生成顺序,依次从
values列表中取出对应数值,保证每个交叉项分配正确的数值。 - 合并结果:用
pd.concat将每行处理得到的小DataFrame合并为最终的data2,并通过ignore_index=True重置索引。
内容的提问来源于stack exchange,提问作者xinxin
相关产品推荐
相关产品推荐

