2

次のデータフレームがあります。

from pandas import *
from math import *
data=read_csv('agosto.csv')


      Fecha         DirViento MagViento
0 2011/07/01 00:00      N       6.6
1 2011/07/01 00:15      N       5.5
2 2011/07/01 00:30      N       6.6
3 2011/07/01 00:45      N       7.5
4 2011/07/01 01:00     ---      6.0
5 2011/07/01 01:15     ---      7.1
6 2011/07/01 01:30      S      4.7
7 2011/07/01 01:45      SE      3.1 
. 
.
.

最初にやりたいことは、風の値を数値に変換して、u と v の風成分を取得することです。しかし、操作を実行すると、不足しているデータ (---) によって競合が発生します。

direccion=[]
for i in data['DirViento']:
    if i=='SSW':
     dir=202.5
    if i=='S':
     dir=180.0
    if i=='N':
     dir=360.0
    if i=='NNE':
     dir=22.5
    if i=='NE':
     dir=45.0
    if i=='ENE':
     dir=67.5
    if i=='E':
     dir=90.0
    if i=='ESE':
     dir=112.5
    if i=='SE':
     dir=135.0
    if i=='SSE':
     dir=157.5
    if i=='SW':
     dir=225.0
    if i=='WSW':
     dir=247.5
    if i=='W':
     dir=270.0
    if i=='WNW':
     dir=292.5
    if i=='NW':
     dir=315.0
    if i=='NNW':
     dir=337.5
    direccion.append(dir)
data['DirViento']=direccion

私は以下を取得します:

data['DirViento'].head()
0    67.5
1    67.5
2    67.5
3    67.5
4    67.5

欠損データに他の行の値が割り当てられるためですか? 次のコードを使用した get のコンポーネント

Vviento=[]
Uviento=[]
for i in range(0,len(data['MagViento'])):
    Uviento.append((data['MagViento'][i]*sin((data['DirViento'][i]+180)*(pi/180.0))))
    Vviento.append((data['MagViento'][i]*cos((data['DirViento'][i]+180)*(pi/180.0))))

data['PromeU']=Uviento
data['PromeV']=Vviento

統計データを取得するためにグループ化されました

index=data.set_index(['Fecha','Hora'],inplace=True)
g = index.groupby(level=0)

しかし、私はエラーが発生します

IndexError: index out of range for array

私は何か間違ったことをしていますか?欠損データを考慮せずに操作を実行するには?

4

1 に答える 1

1

コードにフローが 1 つあります。条件文は次のようになります。

if i == 'SSW':
    dir = 202.5
elif i == 'S':
...
else:
    dir = np.nan 

dirまたは、ループの最初で変数を消去できます。それ以外の場合、データが欠落している行は、前の反復 dirと同じになります。 しかし、このコードは、たとえば次のような、より Pythonic な方法で改善できると思います。dir

# test DataFrame
df = pd.DataFrame({'DirViento':['N', 'N', 'N', 'N', '--', '--', 'S', 'SE'])

  DirViento
0         N
1         N
2         N
3         N
4        --
5        --
6         S
7        SE  

# create points of compass list
dir_lst = ['NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','WSW','W','WNW','NW','NNW','N']
# create dictionary from it
dir_dict = {x: (i + 1) *22.5 for i, x in enumerate(dir_lst)}
# add a new column
df['DirViento2'] = df['DirViento'].apply(lambda x: dir_dict.get(x, None))

  DirViento  DirViento2
0         N         360
1         N         360
2         N         360
3         N         360
4        --         NaN
5        --         NaN
6         S         180
7        SE         135

コメントで@DanAllanからの良い提案を更新すると、コードはさらに短くなり、さらにpythonicになります。

df['DirViento2'] = df['DirViento'].replace(dir_dict)
于 2013-11-08T06:29:03.057 に答える