从 Python Panda 中的另外两个 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

但是我找不到一种有效的方法来在两个 Series 之间实现元素最小值(同时对齐索引和处理 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
53940 次浏览

我能看到的最简单的方法是将它们制作成一个 DataFrame,然后执行行方面的 min:

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

另一种类似的方式:

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

我觉得这是最简单的:

import numpy as np


smax = np.minimum(s1, s2)

链接到文档(numpy.best)

和 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
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

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

事实上,熊猫联合医生使用 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

这种方法可以完成这项工作:

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)

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

这种方法也是 在数据框架上工作

一种直接的方法是使用 Series.where函数:

min_s1_s2 = s1.where(s1 < s2, s2)

where是实现 clip的一种基本方法,但反过来就不行了。