如何为已排序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])
为什么这样更靠谱?
- 全程用Pandas操作DataFrame,不用来回转numpy数组,减少出错概率;
reset_index(drop=True)确保行索引是连续的0开始,判断行位置时不会出错;np.where是向量化操作,比循环每一行效率高很多,尤其是数据量大的时候;- 两种拆分方式可以根据你的需求选择,逻辑清晰明了。
内容的提问来源于stack exchange,提问作者Jess123456
相关产品推荐
相关产品推荐

