如何让np.where接受更多参数,以便过滤>,<和=;不只是>和<?

问题描述:

我正在使用python 3.5并导入了numpy和pandas库。我创建了一个名为df的DataFrame,它有一个从零开始的索引和两列;变化百分比(PofChg)和上,下或平(U_D_F)。如何让np.where接受更多参数,以便过滤>,<和=;不只是>和<?

对于U_D_F列,我想根据PofChg列填充单词'Up','Down','Flat'。 Up表示它大于零,Down表示它小于零,Flat表示它等于零。

的np.where功能似乎除了两件事情, (1)为什么在U_D_F栏显示“向下”当PofChg列数为“零” (2)如何做才能很好地工作我让np.where函数接受更多参数,即不是说 - 如果df.PofChg> 0,如果true显示“Up”或者false显示“Down”,我想将其更改为 - 如果df.PofChg是> 0,如果是真的显示“上”,或者如果假显示“向下”,但如果是等于零,那么显示“平的”

这是当前输出当我打印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) 

为什么显示在U_D_F列“向下”当PofChg列数为“零”

那是因为你的条件np.where为> 0,所以,如果是0 ,条件失败,并选择替代方案。

我想将其更改为 - 如果df.PofChg> 0,如果属实显示“向上”或者虚假显示“向下”,但如果是等于零,则显示“平”

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

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

+0

我不相信我没有理解为什么它显示下来时,它是零,你的答案很好,谢谢,我会标记它正确的时候,让我 – ZacAttack

我一起在这种情况下使用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():

类型的 np.sign(df.PofChg)
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 

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

从什么时候是'ndarray.map'的事情?在我的1.11.1上不存在 – Eric

+1

@Eric'np.sign(df)'返回一个数据帧(同样适用于系列 - 这对我来说似乎很陌生) – ayhan

+0

使用np.where和np有什么区别.sign和地图?是表现还是偏好? – ZacAttack