[英]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.