![](/img/trans.png)
[英]Filter pandas dataframe records based on condition with multiple quantifier regex
[英]How to filter a dataframe and identify records based on a condition on multiple other columns
id zone price
0 0000001 1 33.0
1 0000001 2 24.0
2 0000001 3 34.0
3 0000001 4 45.0
4 0000001 5 51.0
我上面有pandas dataframe,這里有多個id(這里只顯示1個id)。 dataframe 由具有 5 個區域和 5 個價格的特定 id 組成。 這些價格應遵循以下模式
p1(區域 1 的價格)< p2< p3< p4< p5
如果有任何異常,我們應該識別異常記錄並將其打印到文件中。
在這個例子中 p3 <p4 <p5 但 p1 和 p2 是錯誤的。 (p1 > p2 而 p1 < p2 是預期的)
因此應將第一 2 條記錄打印到文件中
同樣,必須對整個 dataframe 中的所有唯一 ID 執行此操作
我的 dataframe 很大,進行此過濾和識別錯誤記錄的最有效方法是什么?
您可以在對值進行排序以確保區域增加后計算每組的diff
。 如果 diff ≤ 0,則價格未嚴格增加,應標記行:
s = (df.sort_values(by=['id', 'zone']) # sort rows
.groupby('id') # group by id
['price'].diff() # compute the diff
.le(0) # flag those ≤ 0 (not increasing)
)
df[s|s.shift(-1)] # slice flagged rows + previous row
示例 output:
id zone price
0 1 1 33.0
1 1 2 24.0
示例輸入:
id zone price
0 1 1 33.0
1 1 2 24.0
2 1 3 34.0
3 1 4 45.0
4 1 5 51.0
5 2 1 20.0
6 2 2 24.0
7 2 3 34.0
8 2 4 45.0
9 2 5 51.0
df[s|s.shift(-1)].to_csv('incorrect_prices.csv')
另一種方法是首先按 id 和區域ascending
對 dataframe 進行sort
,然后使用groupby.shift()
創建一個新列,將下一個價格與上一個價格進行比較。 然后你可以打印出價值下降的價格:
import numpy as np
import pandas as pd
df.sort_values(by=['id','zone'],ascending=True)
df['increase'] = np.where(df.zone.eq(1),'no change',
np.where(df.groupby('id')['price'].shift(1) < df['price'],'inc','dec'))
>>> df
id zone price increase
0 1 1 33 no change
1 1 2 24 dec
2 1 3 34 inc
3 1 4 45 inc
4 1 5 51 inc
5 2 1 34 no change
6 2 2 56 inc
7 2 3 22 dec
8 2 4 55 inc
9 2 5 77 inc
10 3 1 44 no change
11 3 2 55 inc
12 3 3 44 dec
13 3 4 66 inc
14 3 5 33 dec
>>> df.loc[df.increase.eq('dec')]
id zone price increase
1 1 2 24 dec
7 2 3 22 dec
12 3 3 44 dec
14 3 5 33 dec
我添加了一些額外的 ID 來嘗試模仿您的真實數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.