Pandas中向DataFrame切片赋值为何能匹配正确行?
Pandas赋值时行匹配的核心机制解析
我在使用Pandas时遇到一个疑惑,执行以下代码时,即便左侧是仅筛选出部分行的DataFrame切片,右侧是完整的大DataFrame,仍能精准匹配行并赋值,想请教背后的运行机制。
代码片段:
import pandas as pd d = {'party_id': [1, 1, 1, 2, 2, 3, 4, 4, 4, 4], 'date_valid': [6, 2, 1, 3, 4, 5, 0, 8, 7, 9], 'target': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], } df = pd.DataFrame(data=d) print(df) df=df.sort_values(['party_id','date_valid'],ascending=True) # 对行排序 df['lag_target'] = df.groupby(['party_id'])['target'].shift(1) # 计算滞后列 df.loc[df['lag_target'].isnull(),'lag_target'] = df['target'] # 用原target值替换NaN print(df)
我原本以为Pandas会追踪分组索引,但哪怕新建另一个DataFrame执行类似操作也能正常运行,想知道为什么左右侧大小不同还能正确匹配行?
核心原因是Pandas的赋值操作依赖索引(Index)进行行匹配,而非行的物理位置。
具体拆解你的代码逻辑:
- 排序后的
df虽然行的顺序变了,但每一行的原始索引(0-9)并没有被重置,每一行都保留了自己唯一的索引标识; - 当你用
df.loc[df['lag_target'].isnull(),'lag_target']筛选出需要替换的行时,这些行依然带着它们的原始索引; - 右侧的
df['target']是一个完整的Series,每个值也绑定着对应的索引; - Pandas在赋值时,会自动根据索引将右侧的值匹配到左侧对应的行上——只取左侧筛选出的索引所对应的值,忽略其他不匹配的索引。
举个例子:假设筛选出的NaN行索引是2、3、5、6,那么Pandas会从df['target']中找到索引为2、3、5、6的值,分别赋值给左侧对应的行,完全不需要左右侧的DataFrame大小一致。
哪怕你新建另一个DataFrame(比如DF2),只要DF2的索引和你要赋值的切片索引有重叠,Pandas依然会按索引匹配,这就是为什么跨DataFrame也能正常运行的原因。
内容的提问来源于stack exchange,提问作者Michael Mateju
相关产品推荐
相关产品推荐

