我想在大熊猫DataFrame
中搜索最小值。我需要整个数据帧中的min(跨所有值)类似于df.min().min()
。但是,我还需要知道该值出现的位置的索引。
我尝试了很多不同的方法:
df.where(df == (df.min().min()))
,df.where(df == df.min().min()).notnull()
(source)和val_mask = df == df.min().min(); df[val_mask]
(source)。 这些返回非最小值/布尔值的NaN数据帧,但我无法找到获取这些位置(行,列)的方法。
是否有一种更优雅的方法来搜索数据帧的最小值/最大值并返回包含事件的所有位置的列表?
import pandas as pd
keys = ['x', 'y', 'z']
vals = [[1,2,-1], [3,5,1], [4,2,3]]
data = dict(zip(keys,vals))
df = pd.DataFrame(data)
list_of_lowest = []
for column_name, column in df.iteritems():
if len(df[column == df.min().min()]) > 0:
print(column_name, column.where(column ==df.min().min()).dropna())
list_of_lowest.append([column_name, column.where(column ==df.min().min()).dropna()])
list_of_lowest
output: [['x', 2 -1.0
Name: x, dtype: float64]]
答案 0 :(得分:2)
根据您修订的更新:
In [209]:
keys = ['x', 'y', 'z']
vals = [[1,2,-1], [3,5,-1], [4,2,3]]
data = dict(zip(keys,vals))
df = pd.DataFrame(data)
df
Out[209]:
x y z
0 1 3 4
1 2 5 2
2 -1 -1 3
然后以下内容将起作用:
In [211]:
df[df==df.min().min()].dropna(axis=1, thresh=1).dropna()
Out[211]:
x y
2 -1.0 -1.0
所以这使用df上的布尔掩码:
In [212]:
df[df==df.min().min()]
Out[212]:
x y z
0 NaN NaN NaN
1 NaN NaN NaN
2 -1.0 -1.0 NaN
我们使用参数dropna
调用thresh=1
这会删除至少有一个非NaN值的列:
In [213]:
df[df==df.min().min()].dropna(axis=1, thresh=1)
Out[213]:
x y
0 NaN NaN
1 NaN NaN
2 -1.0 -1.0
使用thresh=1
再次致电可能更安全:
In [214]:
df[df==df.min().min()].dropna(axis=1, thresh=1).dropna(thresh=1)
Out[214]:
x y
2 -1.0 -1.0