Python 使用Pandas,如何从一组列中找到满足相应列集条件的最小/最大值和索引?
我有一个数据帧,它有两组列,它们的名称是匹配的(x1,x2,…和y1,y2,…) 对于数据帧中的每一行,我需要创建一个包含min/max x列的新列,以便y分别最小化/最大化 使用Excel,我可以通过以下公式接近所需结果: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) 这是我的方法,
=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