You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中获取DataFrame.loc匹配行的前一行数据?

问题描述

现有如下结构的Pandas DataFrame:

A  B  C  D
0  1  2  3
1  2  6  5
2  5  9  8
3  5  7  9

需要新增match列,在满足条件(B > 4) & (C > 8)的行中,填入该行前一行的A值,而非该行自身的A值。

当前执行代码:

dataframe["match"] = dataframe.loc[(dataframe["B"] > 4) & (dataframe["C"] > 8), ["A"]]

得到的结果是:

A  B  C  D  match
0  1  2  3  NaN
1  2  6  5  NaN
2  5  9  8  2
3  5  7  9  NaN

期望的结果是:

A  B  C  D  match
0  1  2  3  NaN
1  2  6  5  NaN
2  5  9  8  1
3  5  7  9  NaN
解决方案

可以通过以下两种简洁方式实现需求:

方法一:利用shift()获取前一行数据(推荐)

shift(1)会将A列整体下移一位,每一行的值变为上一行的A值,第一行则为NaN。之后通过条件筛选目标行,直接赋值即可:

import pandas as pd

# 初始化match列为空值
dataframe["match"] = pd.NA
# 生成前一行的A值序列
prev_a = dataframe["A"].shift(1)
# 定义筛选条件
condition = (dataframe["B"] > 4) & (dataframe["C"] > 8)
# 给符合条件的行赋值前一行的A值
dataframe.loc[condition, "match"] = prev_a[condition]

方法二:通过索引偏移直接取值

先定位符合条件的行索引,再通过索引减1获取前一行的A值,逐个赋值:

import pandas as pd

dataframe["match"] = pd.NA
condition = (dataframe["B"] > 4) & (dataframe["C"] > 8)
# 获取所有符合条件的行索引
target_indices = dataframe[condition].index

for idx in target_indices:
    if idx > 0:  # 跳过第一行(无前置行)
        dataframe.loc[idx, "match"] = dataframe.loc[idx-1, "A"]

两种方法都能得到预期结果,其中方法一无需循环,处理大数据集时效率更高。


内容的提问来源于stack exchange,提问作者riogezz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:55:20