把风向分为几类

2024-09-28 23:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的问题。
我有一个dataframedf它包含两个列,分别名为datewd
wd表示风向,范围为(0~360)。
所以,df代表某个时间段某处的风向。在

我想把这些风向分为16类:
http://7xrn7f.com1.z0.glb.clouddn.com/16-3-8/30080798.jpg

此处显示范围。在

http://7xrn7f.com1.z0.glb.clouddn.com/16-3-8/8398960.jpg

这就是我现在能处理的问题:

wd_stat = []
for i in range(0,len(df),1):
    wd = df.wd.iloc[i]
    ### NNE 11.25-33.75
    if 11.25 <= wd < 33.75:
       wd_stat.append("NNE")    
    ### NE 33.75-56.25   
    if (33.75 <=wd < 56.25):
       wd_stat.append("NE")
    ### ENE 56.25 - 78.75    
    if (56.25 <=wd < 78.75):
       wd_stat.append("ENE") 
    if (78.75 <=wd < 101.25):
       wd_stat.append("E") 
    if (101.25 <=wd < 123.75):
        wd_stat.append("ESE") 
      .....not done yet......

我的方法是死板和垃圾。
有谁能给我们一些建议来高效地处理这样的分类问题(把数字范围分成若干字符)。在


Tags: comhttpdfifstatglbjpgne
2条回答

做这些事情的一个好方法是使用numpy.digitize()。它接受一个bin和value数组,并返回每个值所在的bin的索引。在匹配的字符串数组中使用这些索引可以获得所需的内容:

import numpy as np
import pandas as pd

df = pd.DataFrame({"wd": pd.Series([20.1,50,8.4,359,243,123])})

directions = np.array('N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW N'.split())
bins = np.arange(11.25, 372, 22.5)
df['wd_stat'] = directions[np.digitize(df['wd'], bins)]
print df

      wd wd_stat
0   20.1     NNE
1   50.0      NE
2    8.4       N
3  359.0       N
4  243.0     WSW
5  123.0     ESE

您可以使用^{}

import pandas as pd

df = pd.DataFrame({"wd": pd.Series([20.1,50,8.4 ])})
print df
     wd
0  20.1
1  50.0
2   8.4

print (df.wd >= 11.25 ) & (df.wd < 33.75 )
0     True
1    False
2    False
Name: wd, dtype: bool

df.loc[(df.wd >= 11.25 ) & (df.wd < 33.75 ), 'new'] = 'NNE'
df.loc[(df.wd >= 33.75 ) & (df.wd < 56.25 ), 'new'] = 'NE'
print df
     wd  new
0  20.1  NNE
1  50.0   NE
2   8.4  NaN

相关问题 更多 >