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

时间:2013-06-07 17:38:38

标签: 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

但我找不到一种有效的方法来在两个系列之间进行元素最小化(同时对齐索引和处理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

8 个答案:

答案 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)

我发现这是最简单的:

import numpy as np

smax = np.minimum(s1, s2)

Link to docs (numpy.minimum)

答案 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