【问题标题】:Creating an element-wise minimum Series from two other Series in Python Pandas在 Python Pandas 中从其他两个系列创建一个元素最小系列
【发布时间】:2013-06-07 17:38:38
【问题描述】:

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

【问题讨论】:

  • 我认为您应该在“nevermind”之后添加位作为答案,而不是在问题的末尾(我赞成)...虽然我不同意min(1, NaN) == 0... .
  • 是的!你应该回答你自己的问题,所以它有一个被接受的答案。

标签: python pandas


【解决方案1】:

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

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

【讨论】:

  • 在 pandas 0.19.2 这比其他方式快三个数量级以上
【解决方案2】:

我觉得这是最简单的:

import numpy as np

smax = np.minimum(s1, s2)

Link to docs (numpy.minimum)

【讨论】:

  • Numpy 会忽略索引,因此这仅适用于两个系列具有相同索引且顺序相同的情况。
  • 又短又甜!
【解决方案3】:

另一种类似的方式:

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

【讨论】:

【解决方案4】:
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

【讨论】:

    【解决方案5】:

    这个方法可以解决问题:

    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)
    

    【讨论】:

      【解决方案6】:

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

        您可以使用 np.minimum 作为参数的 DataFrame 的 combine 方法。 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
        

        【讨论】:

          【解决方案8】:

          与安迪·海登的答案相同,但更容易阅读:

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

          【讨论】:

          • 最好是帮助编辑安迪的答案以使其更易于阅读,而不是提交重复的答案。
          • @KenWilliams 易于阅读的是个人喜好(至少在这种情况下)。
          猜你喜欢
          • 2021-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-29
          • 2018-12-20
          • 2013-09-06
          相关资源
          最近更新 更多