Python 使用Pandas,如何从一组列中找到满足相应列集条件的最小/最大值和索引?

Python 使用Pandas,如何从一组列中找到满足相应列集条件的最小/最大值和索引?,python,pandas,Python,Pandas,我有一个数据帧,它有两组列,它们的名称是匹配的(x1,x2,…和y1,y2,…) 对于数据帧中的每一行,我需要创建一个包含min/max x列的新列,以便y分别最小化/最大化 使用Excel,我可以通过以下公式接近所需结果: =MINIFS(,,MIN()) =MAXIFS(,,MAX()) 虽然我还需要使用Pandas的idxmin和idxmax来获取列名 作为一个例子,下面的数据行需要返回55 /x2(席席,如Y= YMIN)和56 /X3(max Xi,使得Y= Ymax) 这是我的方法,

我有一个数据帧,它有两组列,它们的名称是匹配的(x1,x2,…和y1,y2,…)

对于数据帧中的每一行,我需要创建一个包含min/max x列的新列,以便y分别最小化/最大化

使用Excel,我可以通过以下公式接近所需结果:

=MINIFS(,,MIN())

=MAXIFS(,,MAX())

虽然我还需要使用Pandas的
idxmin
idxmax
来获取列名

作为一个例子,下面的数据行需要返回55 /x2(席席,如Y= YMIN)和56 /X3(max Xi,使得Y= Ymax)


这是我的方法,经过几次尝试和错误:

new_df = (pd.wide_to_long(df.reset_index(), 
                stubnames=['x','y'], 
                i='index',
                j='xy')
            .reset_index()
            .drop('xy', axis=1)
            .groupby(['index', 'y'])['x'].agg(['max', 'min'])
            .groupby('index')
            .apply(lambda x: pd.Series(x.values[[0,-1], [1,0]],
                                       index=['ymin', 'ymax']) )
         )
输出:

       ymin  ymax
index            
0        55    56

更新:如果您还需要列名,这可以是一个选项:

new_df = (pd.wide_to_long(df.reset_index(), 
                stubnames=['x','y'], 
                i='index',
                j='xy')
            .reset_index()
         )

u = (new_df.groupby(['index', 'y'])['x'].agg(['idxmax','idxmin'])
         .groupby('index')
         .apply(lambda x: pd.Series(x.values[[0,-1], [1,0]],
                                       index=['ymin', 'ymax']) )    
    )
然后:

给出:

   index  xy   x  y
1      0   2  55  0
   index  xy   x  y
2      0   3  56  3

给出:

   index  xy   x  y
1      0   2  55  0
   index  xy   x  y
2      0   3  56  3

多亏了Quang Hoang,我成功地整合了这个函数,它给出了我想要的结果:

def conditional_minmax(df, xprefix, yprefix):

    new_df = (pd.wide_to_long(df.reset_index(),
                              stubnames=[xprefix, yprefix],
                              i='index',
                              j='xy')
              .reset_index()
              .drop('xy', axis=1)
              .groupby(['index', yprefix])[xprefix].agg(['max', 'min'])
              .groupby('index')
              .apply(lambda x: pd.Series(x.values[[0, -1], [1, 0]],
                                         index=['_xmin', '_xmax']))
              )

    new_df['_xidxmin'] = abs(df.filter(regex='^' + xprefix).sub(new_df['_xmin'], axis=0)).idxmin(axis=1)
    new_df['_xidxmax'] = abs(df.filter(regex='^' + xprefix).sub(new_df['_xmax'], axis=0)).idxmin(axis=1)

    return new_df

df.loc[row\u list,col\u list].max().max()
?谢谢,但我想这不是我想要的。它将如何考虑y列标准?能否提供示例数据和预期输出?我在问题中添加了一个示例。希望这有意义。这看起来很棒,谢谢!我不知道
wide\u to\u long
函数。是否可以将其扩展为同时返回对应于ymin和ymax的列名?在这种情况下,x2和x3。
def conditional_minmax(df, xprefix, yprefix):

    new_df = (pd.wide_to_long(df.reset_index(),
                              stubnames=[xprefix, yprefix],
                              i='index',
                              j='xy')
              .reset_index()
              .drop('xy', axis=1)
              .groupby(['index', yprefix])[xprefix].agg(['max', 'min'])
              .groupby('index')
              .apply(lambda x: pd.Series(x.values[[0, -1], [1, 0]],
                                         index=['_xmin', '_xmax']))
              )

    new_df['_xidxmin'] = abs(df.filter(regex='^' + xprefix).sub(new_df['_xmin'], axis=0)).idxmin(axis=1)
    new_df['_xidxmax'] = abs(df.filter(regex='^' + xprefix).sub(new_df['_xmax'], axis=0)).idxmin(axis=1)

    return new_df