Pandas DataFrame:如何在行和列范围内本地获取最小值

用户1367204:

我有一个看起来与此类似的Pandas DataFrame,但具有10,000行和500列。

我的数据框

对于每一行,我想查找3天前15:00到今天13:30之间的最小值。

有一些本机的numpy方法可以快速执行此操作吗?我的目标是通过说“ 3天前15:00到0天前(又名今天)13:30的最小值是多少”来获得每一行的最小值?

对于此特定示例,最后两行的答案是:

2011-01-09 2481.22
2011-01-10 2481.22

我当前的方式是这样的:

1. Get the earliest row (only the values after the start time)
2. Get the middle rows 
3. Get the last row (only the values before the end time)
4. Concat (1), (2), and (3)
5. Get the minimum of (4)

但这在大型DataFrame上花费很长时间


以下代码将生成类似的DF:

import numpy
import pandas
import datetime

numpy.random.seed(0)

random_numbers = (numpy.random.rand(10, 8)*100 + 2000)
columns        = [datetime.time(13,0) , datetime.time(13,30), datetime.time(14,0), datetime.time(14,30) , datetime.time(15,0), datetime.time(15,30) ,datetime.time(16,0), datetime.time(16,30)] 
index          = pandas.date_range('2011/1/1', '2011/1/10')
df             = pandas.DataFrame(data = random_numbers, columns=columns, index = index).astype(int)

print df

这是数据框的json版本:

'{“ 13:00:00”:{“ 1293840000000”:2085,“ 1293926400000”:2062,“ 1294012800000”:2035,“ 1294099200000”:2086,“ 1294185600000”:2006,“ 1294272000000”:2097,“ 1294358400000” :2078,“ 1294444800000”:2055,“ 1294531200000”:2023,“ 1294617600000”:2024},“ 13:30:00”:{“ 1293840000000”:2045,“ 1293926400000”:2039,“ 1294012800000”:2035,“ 1294099200000“:2045,” 1294185600000“:2025,” 1294272000000“:2099,” 1294358400000“:2028,” 1294444800000“:2028,” 1294531200000“:2034,” 1294617600000“:2010},” 14:00:00“: {“ 1293840000000”:2095,“ 1293926400000”:2006,“ 1294012800000”:2001,“ 1294099200000”:2032,“ 1294185600000”:2022,“1294272000000“:2040,” 1294358400000“:2024,” 1294444800000“:2070,” 1294531200000“:2081,” 1294617600000“:2095},” 14:30:00“:{” 1293840000000“:2057,” 1293926400000“:2042 ,“ 1294012800000”:2018,“ 1294099200000”:2023,“ 1294185600000”:2025,“ 1294272000000”:2016,“ 1294358400000”:2066,“ 1294444800000”:2041,“ 1294531200000”:2098,“ 1294617600000”:2023}, “ 15:00:00”:{“ 1293840000000”:2082,“ 1293926400000”:2025,“ 1294012800000”:2040,“ 1294099200000”:2061,“ 1294185600000”:2013,“ 1294272000000”:2063,“ 1294358400000”:2024 ,“ 1294444800000”:2036,“ 1294531200000”:2096,“ 1294617600000”:2068},“ 15:30:00”:{“1293840000000“:2090,” 1293926400000“:2084,” 1294012800000“:2092,” 1294099200000“:2003,” 1294185600000“:2001,” 1294272000000“:2049,” 1294358400000“:2066,” 1294444800000“:2082,” 1294531200000“ :2090,“ 1294617600000”:2005},“ 16:00:00”:{“ 1293840000000”:2081,“ 1293926400000”:2003,“ 1294012800000”:2009,“ 1294099200000”:2001,“ 1294185600000”:2011,“ 1294272000000“:2098,” 1294358400000“:2051,” 1294444800000“:2092,” 1294531200000“:2029,” 1294617600000“:2073},” 16:30:00“:{” 1293840000000“:2015,” 1293926400000“:2095 ,“ 1294012800000”:2094,“ 1294099200000”:2042,“ 1294185600000”:2061,“ 1294272000000”:2006,“1294358400000“:2042,” 1294444800000“:2004,” 1294531200000“:2099,” 1294617600000“:2088}}'

JoeCondron:

您可以首先堆叠DataFrame来创建一个序列,然后根据需要对其进行索引切片并取最小值。例如:

first, last = ('2011-01-07', datetime.time(15)), ('2011-01-10', datetime.time(13, 30))
df.stack().loc[first: last].min()

的结果df.stack是一个SeriesMultiIndex其中内水平是由原始列。然后,我们使用tuple带有开始和结束日期和时间的对进行切片如果要执行许多此类操作,则应考虑分配df.stack()给某个变量。然后,您可以考虑将索引更改为适当的DatetimeIndex然后,您可以根据需要使用时间序列和网格格式。

这是避免堆叠的另一种方法,并且在您实际使用的大小的DataFrame上要快得多(一次性使用;将堆叠切成薄片后堆叠起来DataFrame要快很多,因此,如果您要执行许多此类操作,应该堆叠并转换索引)。
这是一般的少,因为它的工作原理与minmax,但不与,说,mean它获取min第一行和最后一行的子集的以及min中间(如果有)之间的行的,并采用min这三个候选者的。

first_row = df.index.get_loc(first[0])
last_row = df.index.get_loc(last[0])
if first_row == last_row:
    result = df.loc[first[0], first[1]: last[1]].min()
elif first_row < last_row:
    first_row_min = df.loc[first[0], first[1]:].min()
    last_row_min = df.loc[last[0], :last[1]].min()
    middle_min = df.iloc[first_row + 1:last_row].min().min()
    result = min(first_row_min, last_row_min, middle_min)
else: 
    raise ValueError('first row must be <= last row')

请注意,如果first_row + 1 == last_rowthen middle_min是,nan但只要middle_min对的调用中不是第一个,结果仍然是正确的min

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Pandas的多个日期时间列中获取最小值

在DataFrame中获取特定日期范围内的最小值和最大值

如何在不创建临时列的情况下从pandas数据框列计算最小值?

Pandas Dataframe groupby聚合函数以及动态的列的最大值和最小值之间的差异

使用级别获取多索引Pandas DataFrame最小值的索引

如何检查列的任何值是否在Pandas中的范围内(两个值之间)?

在按列Y分组时在pandas DataFrame中的列X中查找最小值

从Pandas Dataframe列返回最大值和最小值的实际索引值

在整个Pandas DataFrame中获取具有最小值的行和列

如何在Pandas DataFrame中选择最小值还保存我的字符串数据

获取范围内给定范围内的最小值,范围最小/最大增量

如何在Pandas DataFrame中获得带有特定列的最小值的行?

pandas DataFrame:列中相同符号的值相加的最大值和最小值

如何在Pandas DataFrame中获得最小值不为零的第一行索引?

如何在Pandas DataFrame中获取nan / min值时的最大值/最小值

Pandas:获取组最小值和相应的索引值

如何使用 python pandas 找到 ID 1 和 5 的最小值和最大值?

寻找最小值 pandas/python 未来行范围的特定列中的值

查找 pandas.DataFrame 中每个标签的每列的最小值和最大值

在 Pandas 列中的值范围内均匀采样?

如何过滤 Pandas DataFrame 范围内的日期?

如何按局部最小值对 Pandas DataFrame 进行分组?

Pandas DataFrame ValueError 不在范围内

如何在时间范围内按日期和时间提取数据 - Python Pandas CSV

如何在特定范围内聚合 pandas datetimeindex 的值?

范围内的 Pandas GroupBy 值

在 Pandas 中的列之间搜索范围内的值(不是日期列和没有 sql)

Pandas:如何选择所有列值都在一定范围内的行?

如何在 Pandas 中在单列的不同值范围内创建饼图?