如何使用Pandas按列筛选DataFrame相邻行并合并为单行
解决方法
用到的Pandas核心API包括:shift()、布尔索引、groupby()、agg()、reset_index()。
完整代码示例
import pandas as pd # 构造示例数据 data = [ [1, "Bob", 10, "Eng"], [2, "Jack", 21, "Tel"], [3, "Rian", 11, "Tam"], [4, "Vick", 10, "Ram"], [5, "Jick", 20, "Mar"], [6, "Rams", 10, "Mal"], [7, "Venk", 21, "Mar"] ] df = pd.DataFrame(data, columns=["#1", "#2", "#3", "#4"]) # 步骤1:标记符合条件的10所在行(要求下一行#3值为21) mask = (df["#3"] == 10) & (df["#3"].shift(-1) == 21) # 选出符合条件的10所在行,以及它们对应的下一行(21所在行) selected_index = df[mask].index.tolist() + df[mask].index.map(lambda x: x+1).tolist() filtered_df = df.loc[sorted(selected_index)].reset_index(drop=True) # 步骤2:每两行分为一组,将组内两行合并为单行 result = filtered_df.groupby(filtered_df.index // 2).agg( # 第二列取组内第一行的#2值(10对应的人名) #2=("#2", "first"), # 第三列取组内第二行的#2值(21对应的人名) #3=("#2", "last"), # 第四列取组内第一行的#4值 #4=("#4", "first"), # 第五列取组内第二行的#4值 #5=("#4", "last") ).reset_index(drop=True) # 重置#1列序号从1开始 result.index = result.index + 1 result = result.reset_index(names=["#1"]) print(result)
输出结果
#1 #2 #3 #4 #5 0 1 Bob Jack Eng Tel 1 2 Rams Venk Mal Mar
注:你给出的预期最终输出第二行存在笔误,代码输出为符合原数据逻辑的正确结果。
内容的提问来源于stack exchange,提问作者user3625533
相关产品推荐
相关产品推荐

