我想编写一个函数,该函数可以查看数据帧,在指定的列中找到最大值或最小值,然后返回整个数据帧,并在底部包含包含最大值或最小值的行。 >
我做到了,这样仅返回具有最大值或最小值的行。
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
答案 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)
使用idxmin
或idxmax
:
在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]])
同时添加min
和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
答案 4 :(得分:1)
您可以通过多种方式进行操作。这是一个:
=ARRAYFORMULA(QUERY(TRANSPOSE(QUERY(TRANSPOSE(IFERROR(B2:F*1, 0)),
"select "®EXREPLACE(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