![](/img/trans.png)
[英]Python — Split DataFrame column names into multiple columns names based on dictionary having values in a list
[英]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
我們基本上是在評估兩個條件:
要使用多個條件,請使用 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.gt
和DataFrame.lt
執行逐元素比較,使用或運算符 ( |
) 組合每列的結果,然后使用DataFrame.any
組合列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.