如何将指定数组转为DataFrame并为首行生成满足求和条件的nxt_item列
问题描述
现有一个列名为['item','Space','rem_spc']的数组,具体如下:
array([['Pineapple', 0.5, 0.5], ['Mango', 0.75, 0.25], ['Apple', 0.375, 0.625], ['Melons', 0.25, 0.75], ['Grape', 0.125, 0.875]], dtype=object)
需要完成以下操作:
- 将该数组转换为DataFrame
- 新增
['nxt_item']列,仅为数组第一行(Pineapple行)生成该列值,要求找到首个由其他项的Space值之和等于Pineapple的rem_spc值的项集合。
预期输出:
item Space rem_spc nxt_item Pineapple 0.5 0.5 {Apple, Grape} #0.5 = 0.375 + 0.125 Mango 0.75 0.25 Apple 0.375 0.625 Melons 0.25 0.75 Grape 0.125 0.875
解决方案
使用pandas处理数组转DataFrame,结合组合遍历找到符合条件的项集合,完整代码如下:
import pandas as pd import numpy as np from itertools import combinations # 原始数组 arr = np.array([['Pineapple', 0.5, 0.5], ['Mango', 0.75, 0.25], ['Apple', 0.375, 0.625], ['Melons', 0.25, 0.75], ['Grape', 0.125, 0.875]], dtype=object) # 转换为DataFrame并修正数值类型 df = pd.DataFrame(arr, columns=['item', 'Space', 'rem_spc']) df[['Space', 'rem_spc']] = df[['Space', 'rem_spc']].astype(float) # 获取目标值与其他项数据 target = df.loc[0, 'rem_spc'] other_items = df.iloc[1:] # 遍历子集找首个符合条件的组合 result_set = None for subset_size in range(1, len(other_items)+1): for combo in combinations(other_items.itertuples(), subset_size): total_space = sum(item.Space for item in combo) # 处理浮点数精度问题,用近似相等判断 if abs(total_space - target) < 1e-9: result_set = {item.item for item in combo} break if result_set: break # 为第一行赋值nxt_item df.loc[0, 'nxt_item'] = str(result_set) if result_set else None # 输出结果 print(df.to_string(index=False))
代码说明:
- 先将数组转为DataFrame,把
Space和rem_spc列转为浮点型,确保计算精度 - 提取Pineapple的
rem_spc作为目标值,同时取出除Pineapple外的所有项 - 从单元素子集开始遍历所有可能的组合,计算组合的
Space总和,找到第一个与目标值近似相等的组合 - 将找到的项集合赋值给第一行的
nxt_item,其余行保持空值
内容的提问来源于stack exchange,提问作者user12345
相关产品推荐
相关产品推荐

