簡體   English   中英

Python Pandas 根據其他字段的相對值選擇 dataframe 中的行

[英]Python Pandas selecting rows in a dataframe based on the relative values of other fields

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

df = pd.DataFrame({'ID': ['001', '001', '002', '002'],
 'Flag': ['Y', 'N', 'N', 'Y'],
 'Snapshot Month': ['05', '06', '01', '02']})
ID(不是唯一的) 標志(是/否) 快照月份(每個 ID 唯一)
0001 05
0001 ñ 06
0002 ñ 01
0002 02

所有月份的數據都匯總到一個 dataframe 中,因此 ID 不是唯一的,月份范圍從 01 到 12(01-12 都包括在內;為簡潔起見,我省略了大部分月份)。 flag 變量只能從YN的 go ,而不是相反。 此外,我們可以假設標志變量只能更改一次。

數據中有錯誤。 例如,ID 0002 是非法的,因為它按時間順序從NY

我希望能夠找出與這些數據錯誤相對應的 ID。

我嘗試的是找到一個由YN組成的 dataframe ,並找到共同的 ID,並將 go 放入行本身以查看是否發生錯誤。 但這種方法不僅效率低下,而且隨着數據的變大,也無法擴展。

由於快照月份的范圍是 01 - 12 (所有數據都來自同一年),我計算了一個 dataframe ,其中包含快照月份為 12 的Y ,並檢查它們在除 12 之外的月份中是否有任何N . 然而這也太手動了,並沒有找到所有的答案。 我想知道是否有一些巧妙的方法來使用快照月。

這是一種方法:

(i) 帶有'ID' set_index

(ii) 用np.nan替換N

(iii) groupby "ID" (現在是索引),並向前填充np.nan

(iv) 再次按“ID”分組,查看是否有任何組具有 NaN 值(這意味着這些組具有前導N值)以及是否有創建帶有“ID”的groupby掩碼

(v) 在df上使用 (iv) 中的掩碼

df = df.set_index('ID')
mask = (df['Flag']
        .replace('N', np.nan)
        .groupby(level=0).ffill()
        .groupby(level=0).transform(lambda x: x.isna().sum()>0))
out = df.index[mask].unique().tolist()

Output:

['002']

暫無
暫無

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

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