如何在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
相关产品推荐
相关产品推荐

