如何让np.where接受更多参数,因此它将过滤&gt;,&lt; ,和=;不只是&gt;和<! - ?

时间:2016-09-17 15:51:10

标签: python pandas numpy dataframe where

我正在使用python 3.5并导入了numpy和pandas库。我创建了一个名为df的DataFrame,其索引从零开始,有两列;变化百分比(PofChg)和上升,下降或平坦(U_D_F)。

对于U_D_F列,我想根据PofChg列填充“Up”,“Down”,“Flat”字样。 Up表示大于零,Down表示小于零,Flat表示等于零。

np.where函数似乎运行良好,除了两件事, (1)当PofChg列中的数字为“Zero”时,为什么在U_D_F列中显示“Down” (2)如何使np.where函数接受更多参数,即不是说 - 如果df.PofChg是&gt; 0,如果true显示“Up”或者如果false显示“Down”,我想将其更改为 - 如果df.PofChg是&gt; 0,如果true显示“Up”或假显示“Down”,但如果它等于零则显示“Flat”

这是我打印df时的当前输出

   PofChg U_D_F
0      -1  Down
1       0  Down
2       1    Up
3      -2  Down
4       0  Down
5       5    Up
6       3    Up
7      -6  Down
Press any key to continue . . .

这是我的代码

import pandas as pd
import numpy as np


df = pd.DataFrame({'PofChg':[-1,0,1,-2,0,5,3,-6]})
df['U_D_F'] = np.where(df.PofChg > 0 , 'Up','Down');df

print(df)

2 个答案:

答案 0 :(得分:5)

在这种情况下,我会将map()np.sign()结合使用:

In [133]: mp = {-1:'Down', 0:'Flat', 1:'Up'}

In [134]: df['U_D_F'] = np.sign(df.PofChg).map(mp)

In [135]: df
Out[135]:
   PofChg U_D_F
0      -1  Down
1       0  Flat
2       1    Up
3      -2  Down
4       0  Flat
5       5    Up
6       3    Up
7      -6  Down

np.sign():

In [136]: np.sign(df.PofChg)
Out[136]:
0   -1
1    0
2    1
3   -1
4    0
5    1
6    1
7   -1
Name: PofChg, dtype: int64

np.sign(df.PofChg)的类型:

In [9]: type(np.sign(df.PofChg))
Out[9]: pandas.core.series.Series

答案 1 :(得分:5)

  

当PofChg列中的数字为“零”时,为什么在U_D_F列中显示“向下”

这是因为np.where的条件是&gt; 0,所以,如果它为0,则条件失败,并选择替代。

  

我想将其更改为 - 如果df.PofChg是&gt; 0,如果true显示“Up”或假显示“Down”,但如果它等于零则显示“Flat”

np.where(df.PofChg > 0 , 'Up', np.where(df.PofChg == 0, 'Flat', 'Down'))

如果df.PofChg > 0,则会选择'Up';否则,如果df.PofChg == 0,则选择'Flat',否则选择'Down'