Как использовать fillna () для заполнения отсутствующих данных - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь заполнить некоторые недостающие данные от осадкомеров для гидрологического исследования. У меня есть файл .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.

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...