簡體   English   中英

如何過濾 dataframe 並根據多個其他列上的條件識別記錄

[英]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.

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