提问人:Serge Kashlik 提问时间:3/2/2023 更新时间:3/2/2023 访问量:45
使用 loc 方法的 Pandas 数据帧可变性
Pandas dataframe mutability with loc method
问:
我正在尝试了解在数据帧上使用的内涵。假设我们有以下内容:loc
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
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
为什么第一段代码修改原始数据帧,而第二段代码不修改?
答:
1赞
mozway
3/2/2023
#1
因为在你的第一个代码中,是以下视图:df2
df
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]})
df2 = df.loc[:,'a']
df2._is_view
# True
用于确保拥有副本:copy
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]})
df2 = df.loc[:,'a'].copy()
df2._is_view
# False
为什么?
因为在第一种情况下,切片是 Series(1D 对象),而在第二种情况下是 DataFrame(2D):
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6]})
df.loc[:,'a'].shape
# (3,) -> this is 1D (Series)
df.loc[:,'a'].ndim
# 1
df.loc[:,['a']].shape
# (3,1) -> this is 2D (DataFrame)
df.loc[:,['a']].ndim
# 2
评论
0赞
Serge Kashlik
3/2/2023
我明白这一点。但是,为什么简单地放在括号中会导致副本而不是视图呢?'a'
0赞
mozway
3/2/2023
因为您要从 DataFrame 中切出一个 1D 对象,而不是在第二个代码中切出一个 2D 对象(在第二个维度中只有一个项目)。我添加了一些细节
评论