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

如何为已排序Person数据集DataFrame添加半长拆分标记列?

嘿,别担心~作为Python新手遇到这种逻辑问题太正常了,我来帮你理清楚哪里出了问题,再给你更简洁靠谱的解决方案!

先说说你现有代码的问题:

  • 嵌套循环的变量名重复(两个n),导致逻辑完全混乱;
  • enumerate(dataP[i])遍历的是DataFrame的列名,不是每一行,所以你根本没拿到行的位置信息;
  • 你没有把confval直接加到DataFrame的新列里,而是存在了单独的Confval字典里,这不是你要的“新增一列”的效果;
  • 循环起始值错误:range(1, len(dataP[i]))会漏掉第0行,而且没处理middle == n的边界情况(比如行数是奇数时的中间行)。

优化后的完整流程代码

其实我们可以用Pandas自带的方法简化整个流程,不用来回转numpy数组,既简洁又不容易出错:

import pandas as pd
import numpy as np

# 假设你的原始数据集是df,先按Person拆分并按第9列升序排序
dataP = {}
for i in range(1, 6):
    # 筛选Person为i的数据,按第9列(注意Pandas列索引是0开始,对应你之前的[:,9])升序排序
    filtered_data = df[df['Person'] == i]
    sorted_data = filtered_data.sort_values(by=filtered_data.columns[9], ascending=True)
    dataP[i] = sorted_data

# 为每个人员的DataFrame新增confval列:前半部分0,后半部分1
for i in range(1, 6):
    current_df = dataP[i].reset_index(drop=True)  # 重置索引为0,1,2...确保行位置正确
    total_rows = len(current_df)
    
    # 两种拆分方式选一种:
    # 方式1:严格按整数拆分(偶数行各半,奇数行前半少一行)
    middle = total_rows // 2
    # 方式2:按半长浮点数拆分(奇数行中间行归前半)
    # middle = total_rows / 2
    
    # 用numpy.where快速给新列赋值
    current_df['confval'] = np.where(current_df.index < middle, 0, 1)
    
    # 把修改后的DataFrame存回dataP
    dataP[i] = current_df

# 查看第一个人员的结果
print(dataP[1])

为什么这样更靠谱?

  1. 全程用Pandas操作DataFrame,不用来回转numpy数组,减少出错概率;
  2. reset_index(drop=True)确保行索引是连续的0开始,判断行位置时不会出错;
  3. np.where是向量化操作,比循环每一行效率高很多,尤其是数据量大的时候;
  4. 两种拆分方式可以根据你的需求选择,逻辑清晰明了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:08:22