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
相关产品推荐
相关产品推荐

