You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas设置行时行为异常:两段代码为何输出不同?

为何添加df1[[]]会改变pandas代码的输出?

两段代码仅相差一行df1[[]],其余逻辑完全一致,但输出却截然不同,以下是具体代码与输出:

第一段代码

import pandas as pd

df1 = pd.DataFrame([], columns=['col1', 'col2'])
df1 = df1.append(pd.DataFrame([('a', 1)], columns=['col1', 'col2']))
df1 = df1.append(pd.DataFrame([('b', 2)], columns=['col1', 'col2']))

df2 = pd.DataFrame([('c', 3), ('d', 4)], columns=['col1', 'col2'])

df1.iloc[0] = df2.loc[df2['col1'] == 'c']

print(df1)

第一段代码输出

col1                             col2
0  0    c
Name: col1, dtype: object  0    3
Name: col2, dtype: int64
0                                 b                                2

第二段代码

import pandas as pd

df1 = pd.DataFrame([], columns=['col1', 'col2'])
df1 = df1.append(pd.DataFrame([('a', 1)], columns=['col1', 'col2']))
df1 = df1.append(pd.DataFrame([('b', 2)], columns=['col1', 'col2']))

df2 = pd.DataFrame([('c', 3), ('d', 4)], columns=['col1', 'col2'])

df1[[]]

df1.iloc[0] = df2.loc[df2['col1'] == 'c']

print(df1)

第二段代码输出

col1 col2
0    c    3
0    b    2

这是预期行为吗?原因是什么?

这是pandas 1.3.2版本的预期行为,问题出在**df1[[]]触发了DataFrame内部的类型推断与数据结构隐式调整**:

  • 第一段代码里,初始创建的df1是空DataFrame,后续用append添加数据后,虽然列表面是object和int类型,但因为初始为空,pandas内部的类型标记存在模糊性。执行df1.iloc[0] = df2.loc[df2['col1'] == 'c']时,右侧返回的是带索引的单行DataFrame,赋值时没有正确提取值,反而把整个带索引的对象塞进了单元格,导致输出出现嵌套的索引和类型信息。

  • 第二段代码里的df1[[]]会返回一个保留原列名的空DataFrame,这个操作会触发pandas重新确认df1的列类型与数据结构,相当于给df1做了一次类型校准。之后再赋值时,pandas能正确识别右侧的单行数据,把对应的值提取出来赋值到df1.iloc[0]的单元格里,输出就符合预期了。

本质上这是早期pandas版本中,空DataFrame初始化后追加数据的类型处理bug,df1[[]]相当于临时修复手段,强制pandas明确列的类型规则,避免赋值时的类型混淆。


内容的提问来源于stack exchange,提问作者Jacob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:10:29