簡體   English   中英

從 Python Pandas 中的其他兩個系列創建一個元素級最小系列

[英]Creating an element-wise minimum Series from two other Series in Python Pandas

我無法找到一種方法來對 pandas 中的兩個 Series 對象進行有效的元素最小化。例如,我可以很容易地添加兩個 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 值)。

沒關系。 聯合收割機 function 有一個逃生艙口,因此您可以放入任何元素方面的 function:

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

我覺得這是最簡單的:

import numpy as np

smax = np.minimum(s1, s2)

鏈接到文檔(numpy.minimum)

我能看到的最直接的方法是將它們變成一個 DataFrame,然后按行取最小值:

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

您可以連接數據幀並取最小值,指定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

這種方法也適用於數據框

您可以使用帶有np.minimum作為參數的 DataFrame 的combine方法。 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

這種方法將完成這項工作:

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)

與安迪·海登(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

一種直接的方法是使用Series.where函數:

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

where是可以實現clip的基本方法,但反之則不行。

您可以使用剪輯方法

>>> s1.clip(upper=s2)
1    1
2    1
3    1
dtype: int64

>>> s2.clip(upper=s1)
1    1.0
2    1.0
3    1.0
4    NaN
dtype: float64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM