为什么我不能给Pandas DataFrame的部分赋值?

2 投票
1 回答
3662 浏览
提问于 2025-04-17 22:40

我有点困惑,为什么下面这个 pandas 代码没有成功把A列的最后两个值赋给B列的前两个位置:

df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6, 7], 'B': [10, 20, 30, 40, 50, 60, 70]})
df = df.join(pd.DataFrame({'C': ['a', 'b', 'c', 'd', 'e', 'f', 'g']}))
df['B2'] = df.B.shift(2)
df[:2].B2 = list(df[-2:].A)

让我感到困惑的是,在一个(看起来)相似的“真实”应用中,它似乎是可以工作的(并且产生了一些奇怪的行为)。

为什么最后的赋值没有改变数据表中两个条目的值呢?

1 个回答

5

可能会工作,这就是它的狡猾之处,看看这里:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

通常来说,对于多种数据类型的框架,它是否能正常工作取决于你是什么时候构建的(例如,如果你一次性创建所有内容,我觉得它总是能正常工作)。因为你是在之后创建的(通过连接),所以这就依赖于底层numpy视图创建的机制。

千万千万不要那样赋值,使用loc

df.loc[:2,'B2'] = ....

撰写回答