繁体   English   中英

有效地找到 DataFrame 中的最小值

[英]Efficiently find the minimum value in a DataFrame

我可以使用通常的 Pandas 向量化操作在小数据集上获得最小值及其行和列:

import pandas as pd

data = pd.DataFrame([
  ['A', 'asdf', 1, 2, 3],
  ['B', 'zxcv', 4, 5, 6],
  ['C', 'qwer', 2, 5, 3],
  ['D', 'hjkl', 3, 9, 4],
], columns=['entity', 'code', '2007', '2008', '2009']).set_index('entity')

data_num = data.drop(columns=['code'])

minval = data_num.min().min()
minval_row = data_num.min(axis='columns').idxmin()
minval_col = data_num.min().idxmin()

print(minval, minval_row, minval_col)
# 1 A 2007

然而,这需要对数据进行 3 次单独的扫描,这是低效的。

从算法上讲,一次遍历数据即可获得所有 3 个值。 使用 Pandas 或 Numpy API 是否有可能?

请注意,我也想避免复制数据。 认为如果您拥有所有相同.to_numpy()数据, .to_numpy()将不会复制,但我不是 100% 确定。

我认为你可以stack

minval = data_num.min().min()

print (data[data.eq(minval)].stack())

entity      
A       2007    1.0
dtype: object

您可以从展平底层数组(单程)中获取最小值,并使用简单的数学(快速操作)发送回计算位置:

idx = data_num.values.flatten().argmin()
col = data_num.columns[idx%len(data_num.columns)]
row = data_num.index[idx//len(data_num.columns)]
col, row

输出:

('2007', 'A')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM