从不同DataFrame赋值列时索引的作用及赋值全为NA的原因
Pandas赋值出现全NA的原因及与R的差异
首先看你提供的代码:
import pandas as pd df_1 = pd.DataFrame({'col1': ['a', 'a', 'a']}) df_2 = pd.DataFrame({'col1': ['b', 'b', 'b']}) df_2.index = [4,5,6] df_1['col2'] = df_2.col1
为什么df_1的col2全是NA?
Pandas在进行列赋值时,默认按索引(标签)对齐数据。df_1的索引是[0,1,2],df_2的索引是[4,5,6],两者没有重叠的索引标签,所以Pandas找不到对应位置的数据,只能填充NA。
这种设计的原因
Pandas的核心设计逻辑是标签优先,这是为了确保数据操作的准确性。在处理带标签的数据集(比如时间序列、带用户ID的表格)时,按索引对齐能避免因行顺序变化导致的错位赋值错误——比如你不小心打乱了数据行的顺序,Pandas依然能通过索引匹配正确的数据,而不是盲目按位置填充。
和R语言的差异
R的data.frame在直接赋值列时,采用的是位置优先的逻辑:只要两个数据框行数相同,就会按行的位置顺序一一对应赋值,不管行名(索引)是否匹配。这是两种工具的设计哲学差异:R更侧重快速的位置式操作,而Pandas更强调标签匹配的严谨性。
实现你想要的列复制的方法
如果需要忽略索引,按位置复制数据,可以用以下几种方式:
- 直接取底层数值数组:
df_1['col2'] = df_2.col1.values - 重置df_2的索引后赋值:
df_1['col2'] = df_2.col1.reset_index(drop=True) - 使用
assign方法结合values:df_1 = df_1.assign(col2=df_2.col1.values)
内容的提问来源于stack exchange,提问作者user1700890
相关产品推荐
相关产品推荐

