数据框底部具有 max/min 个值的 Return 行 (python/pandas)

Return rows with max/min values at bottom of dataframe (python/pandas)

我想编写一个可以查看数据帧的函数,找到指定列中的最大值或最小值,然后 return 整个数据帧,其中包含最大值或最小值的行在底部。

我这样做是为了让具有最大值或最小值的行单独得到 returned。

def findAggregate(df, transType, columnName=None):

    if transType == 'max1Column':
        return df[df[columnName] == df[columnName].max()]

    elif transType == 'min1Column':
        return df[df[columnName] == df[columnName].min()]

鉴于下面的数据框,我想检查 col2 的最小值

原始数据框:

col1     col2     col3
blue     2        dog
orange   18       cat
black    6        fish

预期输出:

col1     col2     col3
blue     2        dog
orange   18       cat
black    6        fish
blue     2        dog

实际输出:

col1     col2     col3
blue     2        dog

您可以在 oneliner 中执行此操作:

df.append(df.loc[df['col2'].idxmin()])

输出:

     col1  col2  col3
0    blue     2   dog
1  orange    18   cat
2   black     6  fish
0    blue     2   dog

所以sort_values

df.append(df.sort_values('col2').iloc[[0]])
Out[764]: 
     col1  col2  col3
0    blue     2   dog
1  orange    18   cat
2   black     6  fish
0    blue     2   dog

如果需要 max

df.append(df.sort_values('col2').iloc[[-1]])

同时添加 minmax

df.append(df.sort_values('col2').iloc[[0,-1]])
Out[765]: 
     col1  col2  col3
0    blue     2   dog
1  orange    18   cat
2   black     6  fish
0    blue     2   dog
1  orange    18   cat

使用idxminidxmax:

在 AndyL 的评论后编辑为 .loc

df.append(df.loc[df['col2'].idxmin()], ignore_index=True)

     col1  col2  col3
0    blue     2   dog
1  orange    18   cat
2   black     6  fish
3    blue     2   dog

您可以通过多种方式进行。这是一个:

def findAggregate(df, transType, columnName=None):

    if transType == 'max1Column':
        return df.append(df.loc[df['col2'].idxmax()])

    elif transType == 'min1Column':
        return df.append(df.loc[df['col2'].idxmin()])

关注指标值

并使用一个 loc

i = df.col2.idxmin()
df.loc[[*df.index] + [i]]

     col1  col2  col3
0    blue     2   dog
1  orange    18   cat
2   black     6  fish
0    blue     2   dog

相同的想法,但使用 Numpy 和 iloc

i = np.arange(len(df))
a = df.col2.to_numpy().argmin()
df.iloc[np.append(i, a)]

     col1  col2  col3
0    blue     2   dog
1  orange    18   cat
2   black     6  fish
0    blue     2   dog

这是另一种方式:

In [30]: df.append(df.loc[lambda x:x.col2 == x.col2.min()]).reset_index(drop=True)
Out[30]:
     col1  col2  col3
0    blue     2   dog
1  orange    18   cat
2   black     6  fish
3    blue     2   dog