簡體   English   中英

根據多列中的值篩選 dataframe - 列名可以更改

[英]Filter dataframe based on values in multiple columns - column names can change

我有一個 Pandas dataframe 看起來像這樣:

測試 LSL 美國手語 第0天 第一天 第二天 第三天
1個 0 100 10 10 10 200
2個 0 100 10 10 10 10
3個 10 100 20 5個 5個 20
4個 10 100 20 20 20 20

我想保留 Day0-Day3 列中至少一個值小於 LSL 或大於 USL 的所有行。 在我的示例中,我需要的 dataframe 是:

測試 LSL 美國手語 第0天 第一天 第二天 第三天
1個 0 100 10 10 10 200
3個 10 100 20 5個 5個 20

Day0-Day3 的列數和列名可以更改。 例如,我可以:

測試 LSL 美國手語 第 0 周 第一周
1個 0 100 10 200
2個 0 100 10 10
3個 10 100 20 5個
4個 10 100 20 20

我一直無法弄清楚如何做到這一點,任何建議將不勝感激。

跨列查找最大值、最小值並將其與“LSL”和“USL”值進行比較,以創建一個掩碼來過濾df

max_vals = df.drop(columns=['Test','LSL','USL']).max(axis=1)
min_vals = df.drop(columns=['Test','LSL','USL']).min(axis=1)
mask = (df['LSL'] > min_vals) | (df['USL'] < max_vals)
out = df[mask]

Output:

Test  LSL  USL  Day0  Day1  Day2  Day3
0     1    0  100    10    10    10   200
2     3   10  100    20     5     5    20

對於第二個例子:

   Test  LSL  USL  Week0  Week1
0     1    0  100     10    200
2     3   10  100     20      5

您可以使用多個條件和 boolean 索引。

use_cols = df[[c for c in df.columns if c[-1].isdigit()]]
df.loc[(use_cols.lt(df['LSL'].values) | (use_cols.gt(df['USL'].values))).any(1)]

   Test  LSL  USL  Day0  Day1  Day2  Day3
0     1    0  100    10    10    10   200
2     3   10  100    20     5     5    20

我們基本上是在評估兩個條件:

  1. use_cols列中的值是否小於 LSL? ( lt )
  2. use_cols列中的值是否大於 LSL? gt

要使用多個條件,請使用 or | 本質上,您使用括號()包圍每個條件,並通過鏈接any(axis=1)檢查是否至少返回 1 True

為了允許不同的列名,一個想法是將 select 以數字結尾的列(即 Week0、Day0、Month1、Year2 等)。 但是請記住,如果任何其他列以數字結尾,它將被包含在此處。 或者,等效地,如果列始終位於特定的 position ,則可以使用iloc 這需要您擁有一些領域知識。

這樣的事情應該可以解決問題:

df_subset = df.iloc[:, 3:]
m = (df_subset.lt(df["LSL"], axis=0) | df_subset.gt(df["USL"], axis=0)).any(axis=1)

filtered_df = df[m]
>>> filtered_df 
   Test  LSL  USL  Week0  Week1
0     1    0  100     10    200
2     3   10  100     20      5

通過嘗試創建掩碼(定義一行是否應成為結果的一部分的一系列True / False值)然后將該掩碼應用於您的 dataframe 來解決這類問題總是更容易。

您可以使用DataFrame.gtDataFrame.lt執行逐元素比較,使用或運算符 ( | ) 組合每列的結果,然后使用DataFrame.any組合列。

暫無
暫無

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

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