簡體   English   中英

Pandas在多列上的數據幀布爾掩碼

[英]Pandas dataframe boolean mask on multiple columns

我有一個數據幀(df),其中包含幾個具有實際測量值的列和相應的列數(A,B,...),每個列的不確定性(dA,dB,...):

   A    B    dA      dB
0 -1    3    0.31    0.08
1  2   -4    0.263   0.357
2  5    5    0.382   0.397
3 -4   -0.5  0.33    0.115

我應用一個函數來根據我的定義在測量列中查找有效的值

df[["A","B"]].apply(lambda x: x.abs()-5*df['d'+x.name] > 0)

這將返回一個布爾數組:

     A          B 
0    False      True
1    True       True
2    True       True
3    True       False

我想使用此數組在單個列中選擇條件為真的數據幀中的行,例如A - >第1-3行,並且還查找所有輸入列的條件為真的行,例如第1行和2 有沒有一種有效的方法來做大熊貓?

您可以將apply語句的結果用於從原始數據幀中選擇布爾索引:

results = df[["A","B"]].apply(lambda x: x.abs()-5*df['d'+x.name] > 0)

返回上面的布爾數組:

       A      B
0  False   True
1   True   True
2   True   True
3   True  False

現在,您可以使用此數組從原始數據名稱中選擇行,如下所示:

選擇A為True的位置:

df[results.A]

   A    B     dA     dB
1  2 -4.0  0.263  0.357
2  5  5.0  0.382  0.397
3 -4 -0.5  0.330  0.115

選擇A或B為真的位置:

df[results.any(axis=1)]

   A    B     dA     dB
0 -1  3.0  0.310  0.080
1  2 -4.0  0.263  0.357
2  5  5.0  0.382  0.397
3 -4 -0.5  0.330  0.115

選擇所有列為true的位置:

df[results.all(axis=1)]

   A    B     dA     dB
1  2 -4.0  0.263  0.357
2  5  5.0  0.382  0.397

使用底層數組數據,矢量化方法就是這樣 -

cols = ['A','B'] # list holding relevant column names
dcols = ['d'+i for i in cols]
out = np.abs(df[cols].values) - 5*df[dcols].values > 0

樣品運行 -

In [279]: df
Out[279]: 
   A    B     dA     dB
0 -1  3.0  0.310  0.080
1  2 -4.0  0.263  0.357
2  5  5.0  0.382  0.397
3 -4 -0.5  0.330  0.115

In [280]: cols = ['A','B'] # list holding relevant column names
     ...: dcols = ['d'+i for i in cols]
     ...: out = np.abs(df[cols].values) - 5*df[dcols].values > 0
     ...: 

In [281]: out
Out[281]: 
array([[False,  True],
       [ True,  True],
       [ True,  True],
       [ True, False]], dtype=bool)

要通過將無效的NaNs設置為NaNs來提取有效的,我們可以使用np.where -

In [293]: df[cols] = np.where(out, df[cols], np.nan)

In [294]: df
Out[294]: 
     A    B     dA     dB
0  NaN  3.0  0.310  0.080
1  2.0 -4.0  0.263  0.357
2  5.0  5.0  0.382  0.397
3 -4.0  NaN  0.330  0.115

此外,我們可以獲得所有匹配的行以及每行的all()減少 -

In [283]: np.flatnonzero(out.all(axis=1))
Out[283]: array([1, 2])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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