如何为Pandas DataFrame单个元素赋值字典类型?(Pandas1.5.3/Python3.9)
Pandas赋值异常问题解析
环境
Pandas 1.5.3、Python 3.9
执行代码
import pandas as pd test1_pd = pd.DataFrame([[1,2,3]], columns=['a','b','c']) test2_pd = pd.DataFrame([[1,2,3]], columns=['a','b','c']) test1_pd.loc[0]['a'] = {'x':1,'y':2} test2_pd.loc[0]['a'] = 9
执行结果
test1_pd Out[116]: a b c 0 1 2 3 test2_pd Out[117]: a b c 0 9 2 3
问题
为何test1_pd.loc[0]['a']未被字典值{'x':1,'y':2}替换,而test2_pd.loc[0]['a']能成功被9替换?
原因解析
- 链式索引的本质问题:
loc[0]['a']是两次独立的索引操作,第一步loc[0]返回的是原DataFrame单行的副本,而非直接指向原数据的视图。对副本的赋值操作只会作用于副本本身,不会同步到原DataFrame。 - 数据类型兼容性的影响:
- test2_pd中赋值的
9和原'a'列的int类型一致,此时链式索引的赋值碰巧生效,但这属于Pandas未定义的行为,官方并不推荐依赖这种方式; - test1_pd中赋值的字典与原列的int类型完全不兼容,对副本的类型修改无法回写到原DataFrame,因此原数据没有变化。
- test2_pd中赋值的
- 正确的赋值方式:要安全修改指定位置的值,必须使用单步索引直接定位目标元素,避免链式索引:
test1_pd.loc[0, 'a'] = {'x':1,'y':2}
内容的提问来源于stack exchange,提问作者totnine
相关产品推荐
相关产品推荐

