我有一个看起来与此类似的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}}'
您可以首先堆叠DataFrame来创建一个序列,然后根据需要对其进行索引切片并取最小值。例如:
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
。然后,您可以根据需要使用时间序列和网格格式。
这是避免堆叠的另一种方法,并且在您实际使用的大小的DataFrame上要快得多(一次性使用;将堆叠切成薄片后堆叠起来DataFrame
要快很多,因此,如果您要执行许多此类操作,应该堆叠并转换索引)。
这是一般的少,因为它的工作原理与min
和max
,但不与,说,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_row
then middle_min
是,nan
但只要middle_min
对的调用中不是第一个,结果仍然是正确的min
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句