如何按指定行列位置将列表元素依次插入Pandas DataFrame?
实现方法
你需要的效果不是把整个列表作为单个值存入某一个单元格,而是将列表内的元素,从指定的起始行、列位置开始,沿列方向依次填入连续行的对应列单元格,直接用切片批量赋值即可,不要用单单元格赋值接口。
针对第一个示例的实现代码
目标起始位置:行索引1、列名col 1,待插入列表长度为2,需要覆盖行1、行2的col 1单元格:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'source': ['a', 'b', 'c', 'a'], 'col 1': ['xxx', 'xxx', 'xxx', 'xxx'], 'col 2': ['xxx', 'xxx', 'xxx', 'xxx'] }) list_value = [5, "text"] # 核心赋值:从起始行开始,取和列表等长的连续行,指定目标列批量赋值 df.loc[1 : 1 + len(list_value) - 1, 'col 1'] = list_value
运行后得到的结果和预期完全一致:
source col 1 col 2 0 a xxx xxx 1 b 5 xxx 2 c text xxx 3 a xxx xxx
针对补充测试场景的实现
测试场景里起始位置是行索引1、列名col2,用完全相同的逻辑即可:
d = {'col1': [1, 2,3,5,6,7], 'col2': [3, 4,5,"",5,6]} df = pd.DataFrame(data=d) list_value = [5,"text"] # 从行索引1开始,覆盖连续2行的col2列 df.loc[1 : 1 + len(list_value) - 1, 'col2'] = list_value
运行结果:
col1 col2 0 1 3 1 2 5 2 3 text 3 5 4 6 5 5 7 6
注意事项
- 不要用
df.at[行号, 列名]或者单单元格模式的df.loc[行号, 列名]赋值,这类接口是给单个单元格传值的,传入列表会直接把整个列表作为单元格内容存储,就会出现之前遇到的「单个格子里塞了整个列表」的错误结果。 - 如果需要从起始位置横向向右给连续列赋值,只需要把切片逻辑从行切片换成列切片即可,只要保证选中的单元格数量和待插入列表长度一致,就能正常按顺序填充。
- 如果DataFrame不是默认的连续整数索引,可以提前整理好需要填充的行/列标签列表,比如
df.loc[[行标签1, 行标签2], 列名] = list_value,标签列表长度和待插入列表长度对齐即可。
内容的提问来源于stack exchange,提问作者helpme
相关产品推荐
相关产品推荐

