如何使用if语句基于字符串变量中的值筛选数据集并标记待保留被试
解决方法:筛选符合Practice3 DV > Practice4 DV的被试
我来帮你搞定这个数据筛选的问题!你的数据集是长格式(每个被试对应多行不同试次),核心思路是先提取每个被试的Practice3和Practice4的DV值,比较后再把结果映射回原数据集,新增include列标记是否保留。下面用Python的pandas库来实现,这是处理这类实验数据最常用的工具:
步骤1:准备示例数据
先把你给出的数据集转换成pandas数据框:
import pandas as pd # 构造示例数据 data = [ [1, "Practice1", 67], [1, "Practice2", 3], [1, "Practice3", 78], [1, "Practice4", 14], [1, "Test", 97], [1, "Test", 65], [1, "Test", 28], [1, "Test", 16], [1, "Test", 97], [1, "Test", 35], [2, "Practice1", 100], [2, "Practice2", 99], [2, "Practice3", 99], [2, "Practice4", 100], [2, "Test", 29], [2, "Test", 18], [2, "Test", 33], [2, "Test", 46], [2, "Test", 87], [2, "Test", 95] ] df = pd.DataFrame(data, columns=["subj_id", "trial_type", "DV"])
步骤2:提取并比较Practice3和Practice4的DV值
我们先把每个被试的Practice3和Practice4的DV值转成宽格式,方便比较:
# 筛选出Practice3和Practice4的行,然后转成宽格式 practice_compare = df[df["trial_type"].isin(["Practice3", "Practice4"])]\ .pivot(index="subj_id", columns="trial_type", values="DV")\ .reset_index() # 计算符合条件的标记:Practice3的DV > Practice4的DV则为1,否则为0 practice_compare["include"] = practice_compare.apply( lambda row: 1 if row["Practice3"] > row["Practice4"] else 0, axis=1 )
步骤3:将标记合并回原数据集
把刚才得到的include标记映射回原数据框,这样每个被试的所有行都会有对应的标记:
# 合并原数据和标记 final_df = df.merge(practice_compare[["subj_id", "include"]], on="subj_id", how="left")
结果验证
运行完上面的代码后,你会得到新增include列的数据集:
- 被试1的Practice3(78)> Practice4(14),所以所有行的
include都是1 - 被试2的Practice3(99)< Practice4(100),所以所有行的
include都是0
如果你之后需要筛选保留符合条件的被试,直接用final_df[final_df["include"] == 1]就可以啦。
内容的提问来源于stack exchange,提问作者eegegg
相关产品推荐
相关产品推荐

