匹配并提取DataFrame中至少有一个值超指定范围的日期行ID
解决方法:提取Measure值超出范围的行ID
我来帮你搞定这个需求!我们可以用pandas一步步处理你的DataFrame,找出那些至少有一个Measure值超出指定范围的行,然后提取它们的ID(也就是你的Index列)。
步骤1:构造你的DataFrame
首先,我们先把你给出的数据转换成可操作的pandas DataFrame(注意处理<NA>为pandas的缺失值):
import pandas as pd data = { 'Index': [1, 2, 3, 4, 5, 6], 'Measurement': [56.0, 56.0, 65.0, 129.1, 56.0, pd.NA], 'Date': ['2018-03-16', '2018-03-16', pd.NA, '2018-03-16', '2018-03-16', '2018-03-16'], 'Measure.1': [2, 78, 54, 78, 786, 34], 'Date.1': ['2018-03-23', '2018-03-23', '2018-03-23', '2018-03-23', '2018-03-23', '2018-03-23'], 'Measure.2': [12, 41234, 35, 12, 234, 4], 'Date.2': ['2018-03-29', '2018-03-29', pd.NA, '2018-03-29', '2018-03-29', '2018-03-29'], 'Measure.3': [22.0, 12.0, 323.0, 2.0, 21.0, 54.0], 'Date.3': ['2018-04-05', '2018-04-05', '2018-04-05', '2018-04-05', pd.NA, '2018-04-05'] } df = pd.DataFrame(data)
步骤2:定义数值范围
先设定你要检查的数值范围,比如这里我们假设范围是0到100,你可以根据实际需求修改:
lower_bound = 0 upper_bound = 100
步骤3:筛选所有Measure列
我们先把所有包含Measure的列筛选出来,这样不用手动列出来:
# 匹配所有包含"Measure"的列 measure_cols = df.columns[df.columns.str.contains('Measure')]
步骤4:标记超出范围的行
接下来,我们检查每一行是否存在至少一个Measure值超出范围(这里分两种情况处理缺失值):
情况1:缺失值不算超出范围
只判断数值是否在范围外,缺失值忽略:
out_of_range_mask = df[measure_cols].apply( lambda row: ((row < lower_bound) | (row > upper_bound)).any(), axis=1 )
情况2:缺失值视为不符合条件
如果只要有Measure列是缺失值,也需要提取该行ID:
out_of_range_mask = df[measure_cols].apply( lambda row: ((row < lower_bound) | (row > upper_bound) | row.isna()).any(), axis=1 )
步骤5:提取对应的ID
最后,我们根据标记的结果提取对应的Index值:
out_of_range_ids = df.loc[out_of_range_mask, 'Index'] print(out_of_range_ids)
结果示例
如果用情况1的条件(忽略缺失值),输出结果是:
2 2 3 3 4 4 5 5 Name: Index, dtype: int64
对应的行分别是:
- 第2行:
Measure.2 = 41234超出范围 - 第3行:
Measure.3 = 323超出范围 - 第4行:
Measurement = 129.1超出范围 - 第5行:
Measure.1 = 786超出范围
如果用情况2的条件(包含缺失值),第6行的Measurement是缺失值,也会被加入结果:
2 2 3 3 4 4 5 5 6 6 Name: Index, dtype: int64
内容的提问来源于stack exchange,提问作者zirodec
相关产品推荐
相关产品推荐

