为什么pandas.DataFrame中.loc使用双层方括号赋值会出现NaN?
该现象是pandas的预期行为,非bug
核心原因是pandas不同赋值方式的索引对齐规则不同,具体原理如下:
- pandas的赋值操作默认会做索引对齐,
loc作为严格的标签索引器,会同时对齐行索引和列索引,而直接用[]做列赋值时,不会对齐右侧的列索引,只会按位置匹配。 - 对于
df[['name']] = df[['age']]:
直接用[]选取多列做赋值时,pandas忽略右侧DataFrame的列名,只要左右两边的形状(行数、列数)匹配,就直接按位置把右侧的值填充到左侧列中,所以可以成功把age列的值赋给name列。 - 对于
df.loc[:, ['name']] = df.loc[:, ['age']]:
左右两边返回的都是DataFrame结构,loc赋值会先匹配两边的列名:左侧目标列是name,右侧来源列是age,两边列名无法匹配,匹配不到的位置就会填充为NaN,所以最终name列全为NaN。
你可以通过修改右侧列名和左侧对齐验证这个逻辑,以下代码可以得到预期结果:df.loc[:, ['name']] = df.loc[:, ['age']].rename(columns={'age': 'name'}) - 对于
df.loc[:, 'name'] = df.loc[:, 'age']:
左右两边返回的都是Series结构,Series只有行索引没有列索引,赋值时只需要匹配行索引即可,案例中两边的行索引都是0、1、2完全匹配,所以可以直接赋值成功。
内容的提问来源于stack exchange,提问作者mathgeek
相关产品推荐
相关产品推荐

