如何按行分段为pandas DataFrame设置新列flag的取值
错误原因
你遇到的KeyError: 'flag'确实是因为赋值前没有提前创建flag列导致的。另外你写的切片赋值方式属于链式索引操作,就算提前创建了列,也容易触发pandas的SettingWithCopyWarning警告,甚至可能出现赋值不生效的问题,不推荐使用。
最优实现方式
推荐以下两种写法,都可以避免上述问题,适配任意索引类型的DataFrame,严格按行的前后顺序切分:
写法1:一行代码实现(最简洁)
导入numpy生成等长序列判断位置,直接转成整数即可:
import numpy as np df['flag'] = (np.arange(len(df)) >= len(df)//2).astype(int)
写法2:loc显式赋值(可读性最高,无额外依赖)
用pandas官方推荐的loc语法对指定位置赋值:
mid = len(df) // 2 # 前半部分赋值0 df.loc[:mid-1, 'flag'] = 0 # 后半部分赋值1 df.loc[mid:, 'flag'] = 1 # 可按需加这行显式指定列类型为整数 df['flag'] = df['flag'].astype(int)
补充说明
如果DataFrame行数是奇数,用len(df)//2计算的中间位置是向下取整,前半部分会比后半部分少1行,若需要前半部分多1行,把mid的计算改成mid = (len(df) + 1) // 2即可。
内容的提问来源于stack exchange,提问作者wawawa
相关产品推荐
相关产品推荐

