使用 loc 方法的 Pandas 数据帧可变性

Pandas dataframe mutability with loc method

提问人:Serge Kashlik 提问时间:3/2/2023 更新时间:3/2/2023 访问量:45

问:

我正在尝试了解在数据帧上使用的内涵。假设我们有以下内容: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

因为在你的第一个代码中,是以下视图:df2df

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 对象(在第二个维度中只有一个项目)。我添加了一些细节