为何Pandas中loc两种取值操作对原DataFrame的影响不同?
Pandas loc切片的视图与副本差异
场景1:单列索引(字符串)
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]}) df2 = df.loc[:,'a'] df2.loc[0] = 10 print(df) print(df2)
输出:
a b 0 10 4 1 2 5 2 3 6 0 10 1 2 2 3 Name: a, dtype: int64
场景2:列表索引(单元素列表)
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]}) df3 = df.loc[:,['a']] df3.loc[0] = 10 print(df) print(df3)
输出:
a b 0 1 4 1 2 5 2 3 6 a 0 10 1 2 2 3
核心原因:视图(View) vs 副本(Copy)
- 第一种写法
df.loc[:,'a']返回的是原DataFrame对应列的视图(Series类型),它和原数据共享内存空间。修改df2时本质是直接操作原DataFrame的底层数据,所以原df会同步变化。 - 第二种写法
df.loc[:,['a']]返回的是原数据的副本(DataFrame类型),相当于基于原数据的指定列新建了一个独立的数据集。修改df3只会改动这个新对象,和原df完全无关。
直白点说:用单个字符串取列拿到的是原数据的“引用”,用列表取列拿到的是原数据的“快照”。
内容的提问来源于stack exchange,提问作者Serge Kashlik
相关产品推荐
相关产品推荐

