![](/img/trans.png)
[英]Element-wise multiplication of a series of two lists from separate Pandas Dataframe Series in Python
[英]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
我能看到的最直接的方法是將它們變成一個 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
您可以使用剪輯方法:
>>> 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.