如何基于给定列表从现有DataFrame按status筛选生成新DataFrame
实现方案
直接用pandas的isin()布尔索引即可完成过滤,以下是可直接运行的完整代码:
完整代码
import pandas as pd # 1. 构造原始DataFrame,你可以替换成自己的读入逻辑,比如pd.read_excel/ pd.read_csv data = [ [1,2,3,2,5,"Jon","Work"], [1,2,5,4,5,"Adam","Work"], [9,7,3,9,5,"Adam","Holiday"], [3,2,3,4,5,"Anna","Work"], [1,4,6,8,5,"Anna","Work"], [4,1,6,8,5,"Kate","Off"], [2,1,6,1,5,"Jon","Off"] ] df = pd.DataFrame(data, columns=["x","y","z","x","c","name","status"]) # 2. 定义过滤条件 target_names = ["Jon", "Adam"] target_status = ["Off", "Work"] # 3. 先全局过滤name符合要求的记录,减少后续重复计算 valid_df = df[df["name"].isin(target_names)] # 4. 按status生成对应DataFrame # 方式一:直接生成单独变量,适合status值少的场景 df_off = valid_df[valid_df["status"] == "Off"] df_work = valid_df[valid_df["status"] == "Work"] # 方式二:存入字典统一管理,适合status值较多的场景 # status_df_map = {s: valid_df[valid_df["status"] == s] for s in target_status} # 调用示例:status_df_map["Off"] 即为df_off
输出验证
打印df_off得到结果:
x y z x.1 c name status 6 2 1 6 1 5 Jon Off
打印df_work得到结果:
x y z x.1 c name status 0 1 2 3 2 5 Jon Work 1 1 2 5 4 5 Adam Work
注:原始数据有两个重名的x列,pandas会自动将第二个重名列重命名为x.1,属于正常处理逻辑,不影响过滤结果
内容的提问来源于stack exchange,提问作者Tmiskiewicz
相关产品推荐
相关产品推荐

