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 資料框,這里有多個 id(這里只顯示了 1 個 id)。資料框由具有 5 個區域和 5 個價格的特定 id 組成。這些價格應遵循以下模式
p1(1區的價格)< p2< p3< p4< p5
如果有任何例外,我們應該識別例外記錄并將其列印到檔案中。
在這個例子中 p3 <p4 <p5 但 p1 和 p2 是錯誤的。(p1 > p2 而 p1 < p2 是預期的)
因此第一 2 條記錄應該列印到一個檔案中
同樣,必須對整個資料幀中的所有唯一 ID 執行此操作
我的資料框很大,進行此過濾和識別錯誤記錄的最有效方法是什么?
uj5u.com熱心網友回復:
您可以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
示例輸出:
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')
uj5u.com熱心網友回復:
另一種方法是sort按 id 和 zone 按ascending順序排列您的資料框,然后使用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 來嘗試模仿您的真實資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366362.html
上一篇:用字串pandas替換空值
下一篇:合并不同索引級別的資料幀
