61

我很难找到一种方法来在 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 值)。

没关系。有一个带有 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
4

8 回答 8

46

我能看到的最直接的方法是将它们变成一个 DataFrame,然后按行取最小值:

>>> print pandas.concat([s1, s2], axis=1).min(axis=1)
1    1
2    1
3    1
4    1
dtype: float64
于 2013-06-07T17:52:17.407 回答
44

我觉得这是最简单的:

import numpy as np

smax = np.minimum(s1, s2)

链接到文档(numpy.minimum)

于 2017-09-07T05:01:54.913 回答
27

另一种类似的方式:

In [11]: pd.DataFrame([s1, s2]).min()
Out[11]:
1    1
2    1
3    1
4    1
dtype: float64
于 2013-06-07T21:42:37.423 回答
6
pd.Series([1,2,3,4,5]).clip(upper=pd.Series([6,5,4,3,2]))

will get you:

0    1
1    2
2    3
3    3
4    2
dtype: int64
于 2019-08-23T15:02:51.940 回答
3

您可以连接数据帧并取最小值,指定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

这种方法也适用于数据框

于 2020-05-10T16:35:30.897 回答
3

这种方法将完成这项工作:

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)
于 2020-04-28T15:04:08.793 回答
2

您可以使用combineDataFrame 的方法 withnp.minimum作为参数。 np.minimum对 NaN 和复杂的 NaN 有特殊处理。

实际上,用于 combine 的 pandas 文档使用该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
于 2020-04-20T14:59:52.610 回答
1

与安迪·海登(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
于 2019-02-21T12:33:01.393 回答