返回数据框底部具有最大值/最小值的行(python / pandas)

时间:2019-07-17 21:49:36

标签: python pandas csv max min

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

我做到了,这样仅返回具有最大值或最小值的行。

  SELECT c1, c2, c3
  FROM t1
  MINUS
  SELECT t2c1, t2c2, t2c3
  FROM t2

鉴于下面的数据框,我要检查col2的MIN值

原始数据框:

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

预期输出:

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

您可以在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

答案 3 :(得分: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]])

同时添加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

答案 4 :(得分:1)

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

=ARRAYFORMULA(QUERY(TRANSPOSE(QUERY(TRANSPOSE(IFERROR(B2:F*1, 0)),
 "select "&REGEXREPLACE(JOIN( , IF(LEN(A2:A), 
 "max(Col"&ROW(A2:A)-ROW(A2)+1&"),", "")), ".\z", "")&"")), 
 "select Col2"))

答案 5 :(得分: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