2013-11-08 3 views
2

У меня есть следующий dataframe:Работы с недостающими данными

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 
. 
. 
. 

Первое, что я хочу сделать, чтобы преобразовать значения ветров числовых значений для того, чтобы получить и и у компонентов ветров , Но когда я выполняю операции, отсутствующие данные (---) генерируют конфликты.

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 

, поскольку отсутствуют данные присваивается значение других строк? Компоненты получают с помощью следующего кода

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 

Я делаю что-то не так? Как выполнять операции без учета отсутствующих данных?

+0

Если вы хотите добавить еще один столбец, который вычисленная на основе другого столбцы, ваш путь (цикл по строкам, построение списка, добавление списка в фрейм) не очень в духе панд. Гораздо лучший способ: «data ['PromeU'] = data ['MagViento'] * sin ((данные ['DirViento'] + 180) * (pi/180.0))' –

ответ

1

Я вижу один поток в вашем коде. Вы условный оператор должен быть больше похож:

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

Или вы можете очистить dir переменные в начале цикла. В противном случае dir для строки с отсутствующими данными будет таким же, как 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 в комментариях, код становится еще короче и еще вещий:

df['DirViento2'] = df['DirViento'].replace(dir_dict) 
+2

Хорошее улучшение. Я думаю, что '' apply (...) '' можно было бы проще выполнить с помощью '' replace (dir_dict) ''. Я не тестировал это, но я думаю, что так работает замена. –

+0

@DanAllan спасибо, позвольте мне проверить это –

+1

Кроме того, '' dir = np.nan'' вместо '' dir = None'' позволит тип данных столбца быть float вместо объекта. Если он попытается использовать триггерные функции для этих данных, тип объекта вызовет критические ошибки. –

Смежные вопросы