Pandas列表中DataFrame赋值行为差异原因咨询
为什么修改DataFrame元素能同步到列表,但重新赋值变量却不行?
这事儿本质是Python的变量引用和赋值逻辑在搞鬼,结合Pandas的DataFrame对象特性就清楚了,我给你拆解开说:
先看填充DataFrame时为啥有效
你填充数据时写的:
df_num = Ldf_num[x] df_num[cname][row] += derived_value1
这里df_num就像一个"指针",指向了Ldf_num[x]里那个DataFrame对象本身。你做的df_num[cname][row] += ...是在修改这个对象内部的元素值——相当于直接在原DataFrame上改数据,所以列表里的原对象自然会跟着变,毕竟它们是同一个东西。
再看方案3b为啥无效
而方案3b里的操作:
df_quo = Ldf_quo[x] df_quo = df_num.div(df_den)
第一行确实让df_quo指向了列表里的初始DataFrame,但第二行的=是给变量重新"牵线":把df_quo的指向换成了df_num.div(df_den)返回的全新DataFrame对象,完全和原来列表里的那个初始DataFrame没关系了。列表里的元素还是原来的空架子,当然全是0。
对比可行的方案3
方案3直接写Ldf_quo[x] = df_num.div(df_den),这是直接把列表第x个位置的元素替换成新的DataFrame,相当于直接更新列表的内容,所以能生效。
要是想让方案3b生效该咋改?
如果就想保持类似的写法,得修改原对象的内容,而不是重新赋值变量。比如用Pandas的update方法:
for x in range(0, nframes): df_num = Ldf_num[x] df_den = Ldf_den[x] df_quo = Ldf_quo[x] # 用update把计算结果覆盖到原DataFrame上 df_quo.update(df_num.div(df_den))
这样df_quo始终指向列表里的原对象,update会把商的结果写入原对象的对应位置,列表里的元素自然就更新了。
一句话总结
- 改对象内部的属性/元素:所有指向该对象的引用(包括列表里的)都会同步变化;
- 给变量重新赋值:只是让变量换个对象指向,和原来的对象彻底没关系,列表里的元素当然不会变。
内容的提问来源于stack exchange,提问作者NaiveBayesian
相关产品推荐
相关产品推荐

