2014-03-31 65 views
5

我有多個列數據幀。numpy.where()具有3個或更多個條件

 AC  BC  CC  DC  MyColumn 

Ç

d

我想設置一個新的列 「MyColumn」,其中如果BC,CC和DC小於AC ,你取這三行中的最大值。如果只有CC和DC小於交流,你把CC和DC的最大爲該行,等等等等。如果沒有一個是低於AC,MyColumn應該只取AC值。

我怎麼會做這個用numpy.where()?

回答

5

我的理解是,你所需要的最大,其小於第一列列的,對如果沒有存在這樣的列第一列中的回退;如果是這樣的話:

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

輝煌,這聽起來很愚蠢,但我從來不知道的LT功能(或相應的GT,LE,GE等)。十分感謝你的幫助 – mit13plee

6

您可以使用LT法連同其中:

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 

看每一列的值,看看它們是不到一:

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 

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

+0

真的很好的解釋。如果最好的答案效率不高,這將是完美的答案。真的解釋了其他人如何得到他的答案,並且是超級教育。謝謝! – mit13plee

+1

@ mit13plee然而這些答案做*略*不同的事情! –