从Python Pandas中的另外两个系列创建元素最小系列

use*_*433 37 python pandas

我无法找到一种方法来在pandas中对两个Series对象进行有效的元素最小化.例如,我可以轻松添加两个系列:

In [1]:
import pandas as pd
s1 = pd.Series(data=[1,1,1], index=[1,2,3])
s2 = pd.Series(data=[1,2,2,1], index=[1,2,3,4])
s1.add(s2)    
Out[1]:
1     2
2     3
3     3
4   NaN
dtype: float64
Run Code Online (Sandbox Code Playgroud)

但我找不到一种有效的方法来在两个系列之间进行元素最小化(同时对齐索引和处理NaN值).

没关系.有一个带有combine功能的逃生舱,所以你可以放入任何元素功能:

In [2]:
s1 = pd.Series(data=[1,1,1], index=[1,2,3])
s2 = pd.Series(data=[1,2,2,1], index=[1,2,3,4])
s1.combine(s2, min, 0)
Out[2]:
1    1
2    1
3    1
4    0
dtype: int64
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 32

我能看到的最直接的方法是将它们变成DataFrame,然后采用行方式min:

>>> print pandas.concat([s1, s2], axis=1).min(axis=1)
1    1
2    1
3    1
4    1
dtype: float64
Run Code Online (Sandbox Code Playgroud)

  • 在 pandas 0.19.2 上,这比其他方式快三个数量级以上 (2认同)

And*_*den 22

另一种类似方式:

In [11]: pd.DataFrame([s1, s2]).min()
Out[11]:
1    1
2    1
3    1
4    1
dtype: float64
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于pandas 0.17,如果我调用`min(axis = 1)` (3认同)

Ank*_*ria 19

我发现这是最简单的:

import numpy as np

smax = np.minimum(s1, s2)
Run Code Online (Sandbox Code Playgroud)

链接到docs(numpy.minimum)

  • Numpy 忽略索引,因此这仅在两个系列以相同顺序具有相同索引时才有效。 (4认同)
  • 又短又甜! (2认同)

fre*_*ger 5

pd.Series([1,2,3,4,5]).clip(upper=pd.Series([6,5,4,3,2]))
Run Code Online (Sandbox Code Playgroud)

会让你:

0    1
1    2
2    3
3    3
4    2
dtype: int64
Run Code Online (Sandbox Code Playgroud)