最小值直到行熊猫

pop*_*top 3 python numpy pandas

我在按日期排序数据时遇到了一些问题,例如这样的:

date,       value,      min
2015-08-17,    3,        nan
2015-08-18,    2,        nan
2015-08-19,    4,        nan
2015-08-28,    1,        nan
2015-08-29,    5,        nan
Run Code Online (Sandbox Code Playgroud)

现在我想将列中的min值保存min到这一行,所以结果看起来像这样:

date,       value,      min
2015-08-17,    3,        3
2015-08-18,    2,        2
2015-08-19,    4,        2
2015-08-28,    1,        1
2015-08-29,    5,        1
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一些选择,但仍然不明白我做错了什么,这是我尝试过的一个例子:

data['min'] = min(data['value'], data['min'].shift())
Run Code Online (Sandbox Code Playgroud)

我不想遍历所有行,因为我拥有的数据很大。对于此类问题,您可以使用 Pandas 编写的最佳策略是什么?

Max*_*axU 5

使用cummin()方法:

In [53]: df['min'] = df.value.cummin()

In [54]: df
Out[54]:
         date  value  min
0  2015-08-17      3    3
1  2015-08-18      2    2
2  2015-08-19      4    2
3  2015-08-28      1    1
4  2015-08-29      5    1
Run Code Online (Sandbox Code Playgroud)


Div*_*kar 5

既然你提到你正在处理大数据集,重点是性能,这里是一个使用 NumPy 的np.minimum.accumulate-

df['min'] = np.minimum.accumulate(df.value)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [70]: df
Out[70]: 
         date  value  min
0  2015-08-17      3  NaN
1  2015-08-18      2  NaN
2  2015-08-19      4  NaN
3  2015-08-28      1  NaN
4  2015-08-29      5  NaN

In [71]: df['min'] = np.minimum.accumulate(df.value)

In [72]: df
Out[72]: 
         date  value  min
0  2015-08-17      3    3
1  2015-08-18      2    2
2  2015-08-19      4    2
3  2015-08-28      1    1
4  2015-08-29      5    1
Run Code Online (Sandbox Code Playgroud)

运行时测试 -

In [65]: df = pd.DataFrame(np.random.randint(0,100,(1000000)), columns=list(['value']))

# @MaxU's soln using pandas cummin
In [66]: %timeit df['min'] = df.value.cummin()
100 loops, best of 3: 6.84 ms per loop

In [67]: df = pd.DataFrame(np.random.randint(0,100,(1000000)), columns=list(['value']))

# Using NumPy
In [68]: %timeit df['min'] = np.minimum.accumulate(df.value)
100 loops, best of 3: 3.97 ms per loop
Run Code Online (Sandbox Code Playgroud)