簡體   English   中英

根據另一列的值按分位數過濾 pandas dataframe

[英]Filter pandas dataframe by quantile based on the value of another column

我在將某些過濾器應用於我的數據集時遇到問題,無法弄清楚如何去做。 我有一個包含 7 列的 dataframe。 一列, participant_id標識一個參與者(每個參與者唯一的數值),第二列指示每個參與者屬於哪個組( group ),第三列稱為trial標識試驗(每個參與者執行一個task)和四列var 1var 2var 3var 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()被傳遞給每個組的一個 Dataframe
  • 提供了使用lambda以及獨立 function 的示例
  • 如上所述的示例數據沒有任何特征來證明它是 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())

更新

  • 問題是如何在組內利用 pandas 分位數功能,由第一部分回答
  • 這特別展示了如何使用這種方法來過濾分位數內的行
  • 為演示目的生成了一個形狀相同的隨機數據集
# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM