簡體   English   中英

numpy.where()有3個或更多條件

[英]numpy.where() with 3 or more conditions

我有一個包含多列的數據框。

      AC     BC     CC      DC     MyColumn

一個

C

d

我想設置一個新列“MyColumn”,如果BC,CC和DC小於AC,則取該行的三個最大值。 如果只有CC和DC小於AC,則取該行的CC和DC的最大值等。如果它們都不小於AC,MyColumn應該從AC獲取值。

我怎么用numpy.where()做到這一點?

您可以使用lt方法以及where:

In [11]: df = pd.DataFrame(np.random.randn(5, 4), columns=list('ABCD'))

In [12]: df
Out[12]:
          A         B         C         D
0  1.587878 -2.189620  0.631958 -0.432253
1 -1.636721  0.568846 -0.033618 -0.648406
2  1.567512  1.089788  0.489559  1.673372
3  0.589222 -1.176961 -1.186171  0.249795
4  0.366227  1.830107 -1.074298 -1.882093

注意:您可以使用列的最大子集:

In [13]: df[['B', 'C', 'D']].max(1)
Out[13]:
0    0.631958
1    0.568846
2    1.673372
3    0.249795
4    1.830107
dtype: float64

查看每列的值,看它們是否小於A:

In [14]: lt_A = df.lt(df['A'], axis=0)

In [15]: lt_A
Out[15]:
       A      B      C      D
0  False   True   True   True
1  False  False  False  False
2  False   True   True  False
3  False   True   True   True
4  False  False   True   True

In [15]: lt_A[['B', 'C', 'D']].all(1)
Out[15]:
0     True
1    False
2    False
3     True
4    False
dtype: bool

現在,您可以使用以下所有內容構建所需的結果:

In [16]: df[['B', 'C', 'D']].max(1).where(lt_A[['B', 'C', 'D']].all(1), 2)
Out[16]:
0    0.631958
1    2.000000
2    2.000000
3    0.249795
4    2.000000
dtype: float64

而不是2你可以先插入系列(在這個例子中它恰好相同):

In [17]: df[['C', 'D']].max(1).where(lt_A[['C', 'D']].all(1), 2)
Out[17]:
0    0.631958
1    2.000000
2    2.000000
3    0.249795
4   -1.074298
dtype: float64

然后是A欄:

In [18]: df[['B', 'C', 'D']].max(1).where(lt_A[['B', 'C', 'D']].all(1), df[['C', 'D']].max(1).where(lt_A[['C', 'D']].all(1), df['A']))
Out[18]:
0    0.631958
1   -1.636721
2    1.567512
3    0.249795
4   -1.074298
dtype: float64

顯然,如果你打算重復使用,你應該把它寫成函數!

我的理解是,您需要的列數最多小於第一列,如果不存在此列,則需要在第一列上進行回退; 如果是這樣的話:

>>> df
          A         B         C         D
0  1.587878 -2.189620  0.631958 -0.432253
1 -1.636721  0.568846 -0.033618 -0.648406
2  1.567512  1.089788  0.489559  1.673372
3  0.589222 -1.176961 -1.186171  0.249795
4  0.366227  1.830107 -1.074298 -1.882093

[5 rows x 4 columns]
>>> df[df.lt(df.A, axis=0)].max(axis=1).fillna(df.A)
0    0.631958
1   -1.636721
2    1.089788
3    0.249795
4   -1.074298
dtype: float64

暫無
暫無

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

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