Pandas如何为单列DataFrame多行赋值且不自动新增额外列
问题原因
DataFrame自动新增列的核心原因是二维iloc赋值存在广播歧义:当你使用df.iloc[行切片, 列序号] = 值的写法时,pandas会优先尝试将右侧值按列对齐匹配,如果右侧值是可迭代类型、或维度判断出现偏差,就会自动创建新列来承载拆分后的值,不会默认你要给整段行切片赋同一个标量。
另外你贴出的代码里还有一个逻辑bug:office_time == 30分支中,你给60行长度的切片赋值,却只将tick累加30,会导致后续赋值范围重叠。
修复方法
核心修复:单独提取目标列做赋值操作
不要用二维iloc同时筛选行和列赋值,提前把第0列提取为Series对象,后续所有行范围赋值都操作这个Series。因为Series是原DataFrame对应列的视图,修改会直接同步到原表,且永远不会触发新列创建:
# 提前锁定要操作的目标列 target_col = my_schedule.iloc[:, 0] while tick < 540: # 判空逻辑也可以直接用target_col操作 if target_col.iloc[(tick + 1):(tick + 121)].isnull().all(): # 取choices返回列表的第一个元素,避免后续把列表当值传入 next_space = random.choices( ['office', 'coffee', 'restroom'], transitionmatrix.iloc[row, :] )[0] if next_space == 'office': office_time = random.choice([30, 60, 120]) # 赋值长度和tick步长保持完全一致 if office_time == 30: target_col.iloc[tick:(tick + 30)] = office_activity tick += 30 elif office_time == 60: target_col.iloc[tick:(tick + 60)] = office_activity tick += 60 elif office_time == 120: target_col.iloc[tick:(tick + 120)] = office_activity tick += 120
可选加固:避免意外加列
如果担心其他分支逻辑误操作新增列,可以在循环结束后增加一行校验,仅保留初始的第0列:
my_schedule = my_schedule[[0]]
按上述写法修改后,my_schedule的列数会永远保持为1,字符串只会被赋值到第0列的对应行范围内,不会出现值被复制到新列的问题。
内容的提问来源于stack exchange,提问作者Emma Deijkers
相关产品推荐
相关产品推荐

