[英]Selecting rows in one dataframe based on data in another dataframe in Python Pandas
[英]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 變量只能從Y
到N
的 go ,而不是相反。 此外,我們可以假設標志變量只能更改一次。
數據中有錯誤。 例如,ID 0002 是非法的,因為它按時間順序從N
到Y
我希望能夠找出與這些數據錯誤相對應的 ID。
我嘗試的是找到一個由Y
和N
組成的 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.