Python 筛选满足某些条件的数据帧

Python 筛选满足某些条件的数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下建议: df = {'Modality': {('002_S_0413', '1', '6/21/2017', 'DTI'): 1, ('002_S_0413', '1', '6/21/2017', 'FLAIR'): 1, ('002_S_0413', '1', '6/21/2017', 'T1'): 1, ('002_S_0413', '3', '8/27/2019', 'DTI'): 1, ('002_S_0413', '3', '8/27/2019', 'FLAI

我有以下建议:

df = {'Modality': {('002_S_0413', '1', '6/21/2017', 'DTI'): 1,
  ('002_S_0413', '1', '6/21/2017', 'FLAIR'): 1,
  ('002_S_0413', '1', '6/21/2017', 'T1'): 1,
  ('002_S_0413', '3', '8/27/2019', 'DTI'): 1,
  ('002_S_0413', '3', '8/27/2019', 'FLAIR'): 1,
  ('002_S_0413', '3', '8/27/2019', 'T1'): 1,
  ('002_S_1261', '1', '3/15/2017', 'DTI'): 1,
  ('002_S_1261', '1', '3/15/2017', 'FLAIR'): 1,
  ('002_S_1261', '1', '3/15/2017', 'T1'): 1,
  ('002_S_1261', '2', '4/24/2018', 'DTI'): 1,
  ('002_S_1261', '2', '4/24/2018', 'FLAIR'): 1,
  ('002_S_1261', '2', '4/24/2018', 'T1'): 1,
  ('002_S_1261', '3', '5/01/2019', 'DTI'): 1,
  ('002_S_1261', '3', '5/01/2019', 'FLAIR'): 1,
  ('002_S_1261', '3', '5/01/2019', 'T1'): 1,
  ('002_S_1280', '1', '3/13/2017', 'DTI'): 1,
  ('002_S_1280', '1', '3/13/2017', 'FLAIR'): 1,
  ('002_S_1280', '3', '3/06/2019', 'DTI'): 1,
  ('002_S_4213', '1', '8/14/2017', 'FLAIR'): 1,
  ('002_S_4213', '1', '8/14/2017', 'T1'): 1},
 'Phase': {('002_S_0413', '1', '6/21/2017', 'DTI'): 1,
  ('002_S_0413', '1', '6/21/2017', 'FLAIR'): 1,
  ('002_S_0413', '1', '6/21/2017', 'T1'): 1,
  ('002_S_0413', '3', '8/27/2019', 'DTI'): 1,
  ('002_S_0413', '3', '8/27/2019', 'FLAIR'): 1,
  ('002_S_0413', '3', '8/27/2019', 'T1'): 1,
  ('002_S_1261', '1', '3/15/2017', 'DTI'): 1,
  ('002_S_1261', '1', '3/15/2017', 'FLAIR'): 1,
  ('002_S_1261', '1', '3/15/2017', 'T1'): 1,
  ('002_S_1261', '2', '4/24/2018', 'DTI'): 1,
  ('002_S_1261', '2', '4/24/2018', 'FLAIR'): 1,
  ('002_S_1261', '2', '4/24/2018', 'T1'): 1,
  ('002_S_1261', '3', '5/01/2019', 'DTI'): 1,
  ('002_S_1261', '3', '5/01/2019', 'FLAIR'): 1,
  ('002_S_1261', '3', '5/01/2019', 'T1'): 1,
  ('002_S_1280', '1', '3/13/2017', 'DTI'): 1,
  ('002_S_1280', '1', '3/13/2017', 'FLAIR'): 1,
  ('002_S_1280', '3', '3/06/2019', 'DTI'): 1,
  ('002_S_4213', '1', '8/14/2017', 'FLAIR'): 1,
  ('002_S_4213', '1', '8/14/2017', 'T1'): 1}}

很抱歉,我无法显示标题,但它们如下图所示:

我被困在这一步,我将非常感谢你的帮助

我需要一个代码,用于每个受试者ID查看描述列,如果DTI、T1和FLAIR在一次就诊中出现,则进行该次就诊并删除其余内容,如果他们在多次就诊中出现,则以最小值进行就诊并删除其余内容。如果一次就诊中没有DTI、T1和FLAIR,也删除这些行。 我需要的是为每个受试者ID获取最小访问值,该值包含描述中的三个值(DTI、T1和FLAIR),并删除其余值

我的输出如下所示:


谢谢大家!

假设需要测试“描述”正好是3个值“DTI”、“FLAIR”、“T1”,仅检查给定组中是否存在
n
值是不够的:

# Remove Description and Visit from MultiIndex
new_df = df.reset_index(['Visit', 'Description'])
# Create Set of Values to Check against
check_values = {'DTI', 'FLAIR', 'T1'}
# Create Boolean Index
m = (
        new_df.groupby(level=[0, 1])['Description'].transform(
            lambda g: set(g) == check_values and len(g) == len(check_values)
        )
        & new_df.groupby(level=0)['Visit'].transform('min').eq(new_df['Visit'])
)

# Filter Dataframe with Index and Fix MultiIndex
new_df = new_df[m].set_index(['Visit', 'Description'], append=True)

面具的两个方面:

  • 检查每个组的唯一值是否与预期值匹配,以及每个组的长度是否与预期长度匹配
  • 检查此“就诊”是否为每个“受试者ID”的最小值:

  • 输出(
    new_df
    ):


    这个示例数据的预期输出是什么?类似于我刚才放的表,但知道并非所有访问都必须是1,这是本例中的输出,但在我的数据中,它必须是满足其余标准的最小值谢谢你的回答。这里有个错误:set(g)=check_值和len(g)=len(check_值),因为g没有定义,在这种情况下,g是什么?中间的两个代码块解释了掩码的工作原理。在lambda中使用它,就像在顶部的完整工作示例中一样。嘿@Henry Ecker,你能帮我回答另一个问题吗?根据您的回答,如果“描述”没有确切的3个值“DTI”、“FLAIR”、“T1”,但其中一些值是重复的(例如:“DTI”、“FLAIR”、“T1”、“T1”、“FLAIR”);与其删除整个主题,我希望它检查值是否重复,并删除其中一个重复的值以符合标准,我的意思是将其设置为“DTI”、“FLAIR”、“T1”。你有什么建议吗?我们在评论中没有足够的空间来讨论这个新问题的细节并填写答案。此外,这超出了本问题的范围。我建议您使用预期输入和输出的样本数据创建一个新问题,这样您就有足够的空间来充分解释情况,并可以从每个人的输入中获益。=)如果你能帮我的话,我把我的问题贴在这里[链接]()。谢谢
    set(g) == check_values and len(g) == len(check_values)
    
    new_df.groupby(level=0)['Visit'].transform('min').eq(new_df['Visit'])
    
                                             Modality  Phase
    Subject ID Study Date Visit Description                 
    002_S_0413 6/21/2017  1     DTI                 1      1
                                FLAIR               1      1
                                T1                  1      1
    002_S_1261 3/15/2017  1     DTI                 1      1
                                FLAIR               1      1
                                T1                  1      1