我无法找到一种方法来在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
但我找不到一种有效的方法来在两个系列之间进行元素最小化(同时对齐索引和处理NaN值)。
没关系。有一个带有组合功能的逃生舱,所以你可以放入任何元素功能:
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
答案 0 :(得分:29)
我能看到的最简单的方法是将它们变成DataFrame,然后采用行式min:
>>> print pandas.concat([s1, s2], axis=1).min(axis=1)
1 1
2 1
3 1
4 1
dtype: float64
答案 1 :(得分:20)
另一种类似的方式:
In [11]: pd.DataFrame([s1, s2]).min()
Out[11]:
1 1
2 1
3 1
4 1
dtype: float64
答案 2 :(得分:16)
答案 3 :(得分:2)
您可以将combine
作为参数使用DataFrame的np.minimum
方法。 np.minimum
对NaN和复杂的NaN具有特殊处理。
实际上,pandas docs for combine使用np.minimum
函数来说明“真正的元素组合”:
>>> df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4]})
>>> df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
>>> df1.combine(df2, np.minimum)
A B
0 1 2
1 0 3
答案 4 :(得分:2)
此方法将完成这项工作:
import pandas as pd
def elementwise_min(x, y):
x[x > y] = y
return x
a = pd.Series([1, 2, 3])
b = pd.Series([0, 2, 4])
elementwise_min(a, b)
答案 5 :(得分:1)
pd.Series([1,2,3,4,5]).clip(upper=pd.Series([6,5,4,3,2]))
会让您:
0 1
1 2
2 3
3 3
4 2
dtype: int64
答案 6 :(得分:1)
您可以合并数据框并采用最小值,并指定level=0
:
>>> s1 = pd.Series(data=[1,1,1], index=[1,2,3])
>>> s2 = pd.Series(data=[1,2,2,1], index=[1,2,3,4])
>>> pd.concat([s1, s2]).min(level=0)
1 1
2 1
3 1
4 1
dtype: int64
这种方法也是works on dataframes。
答案 7 :(得分:0)
答案与安迪·海登(Andy Hayden)相同,但更容易理解:
>>> import pandas as pd
>>> s1 = pd.Series(data=[1,2,3,4,5], index=[1,2,3,4,5])
>>> s2 = pd.Series(data=[5,1,3,5], index=[1,2,3,4])
>>> pd.DataFrame([s1, s2]).min()
1 1.0
2 1.0
3 3.0
4 4.0
5 5.0
dtype: float64