我无法找到一种方法来在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)
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)
Ank*_*ria 19
我发现这是最简单的:
import numpy as np
smax = np.minimum(s1, s2)
Run Code Online (Sandbox Code Playgroud)
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)