Я пытаюсь заполнить некоторые недостающие данные от осадкомеров для гидрологического исследования. У меня есть файл .csv, который содержит все данные об осадках, в которых столбцы (1264) являются идентификатором датчика, а строки (25000 приблизительно) являются датами. Вот пример файла:
Fecha 11025010 13090010 15015020 16050170 21010040 21010050 \
0 1983-01-13 0.0 0.0 0.0 0.0 0.0 0.0
1 1983-01-14 0.0 0.0 0.0 0.0 3.0 0.0
2 1983-01-15 0.0 0.0 0.0 0.0 0.0 1.0
3 1983-01-16 0.0 0.0 0.0 0.0 4.0 0.0
4 1983-01-17 0.0 0.0 0.0 0.0 0.0 0.0
5 1983-01-18 0.0 0.0 0.0 0.0 0.0 1.0
У меня есть еще один файл .csv, который содержит координаты каждого датчика, и я использую его для замены значений NaN в серии DataFrame в осадках, поэтому недостающие данные заполняютсяс информацией ближайшего датчика. До сих пор я был в состоянии сделать это с помощью этого кода:
import pandas as pd
import numpy as np
import math
#Import series data
series = pd.read_csv('Serie para prueba de completado de datos.csv',
parse_dates=[0],
dtype='float64')
series['Fecha'] = pd.to_datetime(series['Fecha'].dt.strftime('%d/%m/%Y'))
#Import coordenates data
coor = pd.read_csv('Coordenadas.csv', dtype='float64')
#Converts every element on series DataFrame to number type except for the date column
cols = list(series.columns.get_level_values(0))[1:]
series[cols] = series[cols].apply(pd.to_numeric, errors='coerce', axis=1)
#Generates a DataFrame that has the relative distance between the gauges
#The column index is the index of the nearest gauge
#It can be seen from the output that the principal diagonal of the matrix is set to zero, this is coherent because
#it is calculating the distance from a n_gauge to itself
dist = []
for i in coor.index:
n_dist = []
for j in coor.index:
h = math.sqrt(((coor['X'][i] - coor['X'][j])**2) + ((coor['Y'][i] - coor['Y'][j])**2))
n_dist.append(h)
dist.append(n_dist)
#Finds the column index that refers to the nearest gauge index on series DataFrame to which the gauge list in order is
#the nearest
nearest_gauge_index = df.apply(lambda x: df.columns[x.replace(0, np.nan).argmin()], axis = 1)
#Funtion to find column index by its name
def column_index(df, query_cols):
cols = df.columns.values
sidx = np.argsort(cols)
return sidx[np.searchsorted(cols,query_cols,sorter=sidx)]
#Finds all the columns with missing data
null_columns = series.columns[series.isnull().any()]
#Get the header of the columns in a list
series_nan_values = series[series.isnull().any(axis=1)][null_columns].head()
#Fill missing data with the data of the nearest gauge
for gauge in list(series_nan_values.columns):
########HERE SHOULD BE AN IF CLAUSE!!
series[:][gauge] = series[:][gauge].fillna(series.iloc[:, nearest_gauge_index[column_index(series, gauge)]])
series.to_csv('DATOS_COMPLETADOS.csv', index = False)
Строка, где я написал ########HERE SHOULD BE AN IF CLAUSE!!
, заключается в том, что иногда, и из-за очень большого размера серии осадков DataFrame, я могузаполнять недостающие данные датчика в любую дату или диапазон дат из ближайшего датчика, который, возможно, также не имеет данных, поэтому мне нужно найти второй ближайший датчик и посмотреть, есть ли в нем данные вдиапазон дат, который я хочу завершить, а если нет, то поищите третий и т. д.
Я не знаю, как создать это условие if или есть другой обходной путь.
Кстати, я использую Python 2.7.
Спасибо за помощь.