【问题标题】:How to find the index (like an idxmin) OR find the row with the minimum of all columns in a dataframe如何查找索引(如 idxmin)或查找数据框中所有列中最小的行
【发布时间】:2017-11-23 16:25:01
【问题描述】:

我有一个以下形式的数据框,其中索引是日期时间值:

日期_事件| Col1 | Col2 | Col3

2017 年 15 月 1 日 | 0.55 | 0.23 | 0.75

15/02/2017 | 0.17 | 0.11 | 0.07

15/03/2017 | 0.78 | 0.93 | 0.98

15/04/2017 | 0.65 | 0.13 | 0.19

15/05/2017 | 0.20 | 0.40 | 0.70

15/06/2017 | 0.28 | 0.31 | 0.79

我想获取列中对应的最小值的行(简称日期),以便找到所有先前点都较低的值。

日期_事件| Col1 | Col2 | Col3

2017 年 15 月 1 日 | 0.55 | 0.23 | 0.75

15/02/2017 | 0.17 | 0.11 | 0.07

15/03/2017 | 0.78 | 0.93 | 0.98

15/04/2017 | 0.65 | 0.13 | 0.19

15/05/2017 | 0.20 | 0.40 | 0.70

15/06/2017 | 0.28 | 0.31 | 0.79

所以我们得到答案 -> 15/02/2017 因为 0.17 是第 1 列中的最小值,0.11 是第 2 列中的最小值,0.07 是第 3 列中的最小值。

我的猜测是可能会使用 Lambda 函数,但我会将它留给各位专家。

提前谢谢你。

【问题讨论】:

  • 到目前为止您尝试过什么?我在你的问题中没有看到代码,请做一些研究,尝试一些代码,如果你不能解决问题,请提出问题。
  • 我知道一个可靠的方法是使用 df.cummin() 但它给了我整个数据框。我仍然需要找到值最小的日期值范围。 .cummin() 也独立地给了我每列的累积最小值。当所有数据点相对于不同列中的其他点的值最小时,我想提取该行。

标签: python dataframe time-series


【解决方案1】:

您可以先将数据框文件转换为 numpy ndarray,如下所示:

import numpy as np
data = np.genfromtxt(dataframe.txt, delimiter='|', dtype='S')

要获取索引,您可以这样做:

initial_row = np.array([1, 1, 1]) # Initial values, arbitrary but large
for row in data:
    float_row = np.array(row[1:], dtype='float')
    if all(float_row < initial_row):
        initial_row = float_row
        index = row[0]
if all(initial_row == np.array([1,1,1])):
    index = 'None'

如果是index == 'None',那么您的数据中没有一行,每一列都小于其余列。

【讨论】:

  • 我认为您的else: 存在缩进问题,无法对其进行编辑,因为编辑时间不够长,无法接受
  • @GrayCygnus 这不是错字,else 缩进在for 循环的级别只有当if 语句对于每次迭代都为 False 时才“通过”。请参阅this有关此事的相关问题。
  • 在这个例子中,else 语句确保index 总是有一个值。如果它是“无”,那么您的数据中没有一行的三列小于其余列。否则,索引等于最小行的“日期”。
  • Nice :) 不知道 python 支持该构造,感谢您的知识。但是,检查您链接的问题在评论中提到,else 仅在找到所需列时在for 循环内添加break 时才相关。否则,无论您获得有效的列,它都将始终转到 else 构造。
  • 引用那条评论:“我认为很多人的真正问题是“for ... else foo() 和将 foo() 放在 for 循环之后有什么区别?”和答案是它们的行为不同仅当循环包含一个break(如下文详细描述)。——Sam Kauffman"
猜你喜欢
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2020-05-08
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多