返回数据框底部的最大/最小值行(Python/Pandas)

5
我想编写一个函数,可以查看数据框中指定列的最大或最小值,然后返回包含最大或最小值的行的整个数据框,并将它们放在底部。
我已经让该函数只返回包含最大或最小值的行。
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
6个回答

6

聚焦于索引值

并且只使用一个 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

5

使用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

3
idxmaxidxmin返回的是索引,而不是整数索引。问题没有指定索引类型。因此,如果索引不是“rangeindex”,这将会失败。我认为像其他答案中所使用的loc更加安全。 - Andy L.
1
好的建议,已编辑并在回答中注明了您的评论 @AndyL。 - Erfan

2

你可以用一行代码实现这个功能:

最初的回答:

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

2
最初的回答:所以 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]])

adding both min and max

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

1
你可以用各种方式实现,这里是其中一种:

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()])

0

这里是另一种方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接