[英]Filter pandas dataframe by quantile based on the value of another column
我在将某些过滤器应用于我的数据集时遇到问题,无法弄清楚如何去做。 我有一个包含 7 列的 dataframe。 一列, participant_id
标识一个参与者(每个参与者唯一的数值),第二列指示每个参与者属于哪个组( group
),第三列称为trial
标识试验(每个参与者执行一个task)和四列var 1
、 var 2
、 var 3
、 var 4
(对应于每个试验记录的四个变量的数值)。 参与者进行了 100 多次试验,参与者进行了大约 50 次试验。
简短的例子:
participant_id group trial var1 var2 var3 var4
189 A 1 -0.231046 0.245615 -0.581238 -0.593562
189 A 2 -0.231046 0.245615 -0.581238 -0.593562
189 A 3 -0.231046 0.245615 -0.581238 -0.593562
189 A 4 -0.231046 0.245615 -0.581238 -0.593562
345 B 1 NaN 0.245615 -0.581238 -0.593562
345 B 378 -0.231046 0.245615 -0.581238 -0.593562
227 A 1 -0.231046 0.245615 -0.581238 -0.593562
227 A 1 -0.231046 0.245615 -0.581238 -0.593562
227 A 2 -0.231046 0.245615 -0.581238 -0.593562
432 B 517 -0.231046 0.245615 NaN -0.593562
432 B 2 -0.231046 0.245615 NaN -0.593562
432 B 333 -0.231046 0.245615 -0.581238 -0.593562
4 名参与者的示例。 请注意,试用号不是唯一的,因为两个不同的参与者可以有一个试用“1”,而同一个参与者也可以有多个试用“1”。 (不要介意每行的 var 列的值都是相同的,在实际数据集中并非如此)。 真实的数据集是 10000 行。
我需要做的是根据var1
的值保留每个唯一参与者的前 n 个分位数试验。 我正在考虑使用 pandas.quantile(n) function,但我不知道如何告诉它应该分别分析每个参与者,而不是整行来获得分位数。
任何帮助表示赞赏。
apply()
被传递给每个组的一个 Dataframelambda
以及独立 function 的示例df = pd.read_csv(io.StringIO(""" participant_id group trial var1 var2 var3 var4
189 A 1 -0.231046 0.245615 -0.581238 -0.593562
189 A 2 -0.231046 0.245615 -0.581238 -0.593562
189 A 3 -0.231046 0.245615 -0.581238 -0.593562
189 A 4 -0.231046 0.245615 -0.581238 -0.593562
345 B 1 NaN 0.245615 -0.581238 -0.593562
345 B 378 -0.231046 0.245615 -0.581238 -0.593562
227 A 1 -0.231046 0.245615 -0.581238 -0.593562
227 A 1 -0.231046 0.245615 -0.581238 -0.593562
227 A 2 -0.231046 0.245615 -0.581238 -0.593562
432 B 517 -0.231046 0.245615 NaN -0.593562
432 B 2 -0.231046 0.245615 NaN -0.593562
432 B 333 -0.231046 0.245615 -0.581238 -0.593562
"""), sep="\s+")
def f(d):
return d.quantile()
df.groupby("participant_id", as_index=False).apply(f)
df.groupby("participant_id", as_index=False).apply(lambda d: d.quantile())
# generate a useful dataset to analyse...
s = 100
df = pd.DataFrame({"participant_id":np.random.choice([189,227,345,432],s),
"trial":np.random.randint(1,6,s),
"group":np.random.choice(["A","B"],s),
"var1":np.random.rand(s),
"var2":np.random.rand(s),
"var3":np.random.rand(s),
"var4":np.random.rand(s),
})
# split into 10 quantile bins and take 0th bin
# split into 10 quantile bins and take 0th bin
df.groupby("participant_id").apply(
lambda d: d.loc[pd.qcut(d.var1, q=10, retbins=False, labels=False).le(0)]).droplevel(0)
参与者ID | 审判 | 团体 | 变量1 | 变量2 | 变量3 | var4 | |
---|---|---|---|---|---|---|---|
13 | 189 | 3 | 一个 | 0.0273875 | 0.87134 | 0.555792 | 0.67094 |
85 | 189 | 1 | 一个 | 0.0106758 | 0.352578 | 0.481009 | 0.910989 |
91 | 189 | 4 | 一个 | 0.00835706 | 0.644102 | 0.990459 | 0.816669 |
4 | 227 | 5 | 乙 | 0.10132 | 0.870446 | 0.389972 | 0.313782 |
71 | 227 | 4 | 乙 | 0.0221867 | 0.17566 | 0.659024 | 0.910838 |
74 | 227 | 1 | 一个 | 0.0762526 | 0.458995 | 0.492384 | 0.556408 |
28 | 345 | 5 | 一个 | 0.130674 | 0.0336628 | 0.0429884 | 0.799307 |
82 | 345 | 1 | 乙 | 0.234522 | 0.371108 | 0.451911 | 0.54528 |
93 | 345 | 4 | 乙 | 0.272915 | 0.594262 | 0.392285 | 0.56374 |
16 | 432 | 2 | 乙 | 0.0403964 | 0.880132 | 0.45438 | 0.0466626 |
18 | 432 | 5 | 一个 | 0.0884496 | 0.304541 | 0.969059 | 0.949315 |
22 | 432 | 2 | 乙 | 0.115796 | 0.0371306 | 0.631284 | 0.537881 |
55 | 432 | 2 | 乙 | 0.102859 | 0.0416843 | 0.761466 | 0.56438 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.