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