我有一个熊猫数据框架,看起来和这个类似,但是有10000行和500列。
python - Pandas DataFrame:如何在行和列的范围内本地获得最小值-LMLPHP
对于每一行,我希望找到3天前15:00到今天13:30之间的最小值。
有没有一些天生的麻木的方法可以很快做到这一点?
我的目标是通过说“从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)

但这在大型数据帧上需要很长时间
以下代码将生成类似的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”:“129384000000”:2085,“129384000000”:2062,“129480000000”:2035,“1294099200000”:2086,“1294185600000”:2006,“129427200000”:2097,“1294358400000”:2078,“129444800000”:2055,“129451200000”:2023,“129461760000”:2024,“13:30:00”:“129384000000”:2045,“1293926000000”:2039,“129480000”:2035,“1294099200000”:2045,“1294185600000”:2025,“129427200000”:2099,“129438400000”:2028,“129444800000”:2028,“129451200000”:2034,“129461760000”:2010,“14:00:00”:“129384000000”:2095,“1293926000000”:2006,“129480000”:2001,“1294099200000”:2032,“1294185600000”:2022,“129427200000”:2040,“1294584000”:204000“:2024”,129444800000“:2070”,12945320000“:2081”,129461760000“:2095”,14:30:00“:”129384000000“:2057”,129392600000“:2042”,129480000“:2018”,1294099200000“:2023”,1294185600000“:2025”,129427200000“:2016”,129458400000“:2066”,129444800000“:2041”,129451200000“:2098”,129467600000“:2023”,15:00:00“:”129384000000“:2082”,129384000000“:2025”,129480000000“:2040”,1294099200000“:2061”,1294185600000“:2013”,129427200000“:2063”,129458400000“:2024”,129444800000“:2036”,129451200000“:2096”,1294617600000“:2068”,15:30:00“:”129384000000“:2090”,12936400000“:2084”,12948000000“:2092”,1294099200“:2003”,1294185600000“:2001”,129427200000“:2049”,1294358400000“:2066”,129444800000“:2082”,129451200000“:2090”,129461760000“:2005”,16:00:00“:”129384000000“:2081”,129392600000“:2003”,129480000“:2009”,1294099200000“:2001”,1294185600000“:2011”,129427200000“:2098”,129458400000“:2051,“129444800000”:2092,“129451200000”:2029,“129461760000”:2073,“16:30:00”:“129384000000”:2015,“129392600000”:2095,“129480000”:2094,“129499200000”:2042,“129418500000”:2061,“129427200000”:2006,“129458400000”:2042,“129444800000”:2004,“129451200000”:2099,“129467600000”:2088”

最佳答案

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

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

df.stack的结果是一个Series和一个MultiIndex的结果,其中内部级别由原始列组成。然后我们使用带有开始和结束日期和时间的tuple对进行切片。
如果要进行大量这样的操作,那么应该考虑将df.stack()分配给某个变量。然后您可以考虑将索引更改为适当的DatetimeIndex。然后您可以根据需要使用时间序列和网格格式。
这是另一种避免堆叠的方法,在实际使用的数据帧大小上速度更快(作为一次性操作,堆叠后的切片速度更快),因此,如果要执行许多这些操作,则应堆叠并转换索引。
它不太一般,因为它与DataFramemin一起工作,但不与,例如,max一起工作。它获取第一行和最后一行的子集的mean和中间行的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')

注意,如果min那么first_row + 1 == last_rowmiddle_min但只要在调用nanmiddle_min不是第一个,结果仍然正确。

07-26 09:36