Усреднение нескольких значений в кадре данных для заполнения значений NaN в одном столбце - PullRequest
0 голосов
/ 09 января 2019

У меня есть фрейм данных, где данные прогрессируют с интервалом в один час, но в одном из столбцов есть несколько значений NaN. Когда я сталкиваюсь с NaN, я хотел бы, чтобы код усреднял четыре часа до NaN, а затем заменял NaN на это среднее.

Я устал изменять ответ на этот вопрос: pandas DataFrame: заменить значения nan на среднее значение столбцов , но в этом примере берется среднее значение по всему столбцу, а не по части столбца.

Мой фрейм данных:

0     1        2    ...     6      7     8  
3   12:53    2.778  ...   -12.2  -16.7  69%         
4   11:53    3.611  ...    NaN   -17.2  73%        
5   10:53    2.778  ...   -13.7  -17.2  73%       
6   09:53    3.611  ...   -13.3  -17.2  73%        
7   08:53    2.778  ...   -12.8  -16.7  76%        
… 
74  13:53    0.278  ...    -15   -17.2  83%

Вот моя измененная попытка вызвать последние 4 в столбце следующим образом:

for i in df.index:
    df[6].fillna(df[6].iloc[0:3].mean(), inplace=True)

Это возвращает первые 4 строки столбца 6, что имеет смысл, почему я получаю этот результат, но я не знаю, как заставить его вызвать 4 строки после NaN и усреднить их.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы можете использовать rolling с окном n, чтобы получить скользящее среднее предыдущих индексов n, а затем заполнить свой na следующими значениями:

df = pd.DataFrame({'col1':[1,2,3,4,5,6,np.nan,8,9,10]})
df['rollmean5'] = df['col1'].rolling(5,center=False,min_periods=1).mean()
df['col1'] = df['col1'].fillna(df['rollmean5'])

При использовании скользящего окна 5 получается среднее значение текущего индекса и предыдущего 4.

Выход:

    col1    rollmean5
0   1.0     1.00
1   2.0     1.50
2   3.0     2.00
3   4.0     2.50
4   5.0     3.00
5   6.0     4.00
6   4.5     4.50
7   8.0     5.75
8   9.0     7.00
9   10.0    8.25

И, очевидно, вы можете отказаться от только что созданного rollmean5, когда закончите.

0 голосов
/ 11 января 2019

Использование кода, предоставленного Джо Паттеном выше, прекрасно работало, пока у меня не было NaN в верхнем ряду столбца. Чтобы решить эту проблему, я проверяю, является ли первое значение NaN, если это так, инвертирует фрейм данных и запускает скользящее среднее от того, что было снизу вверх, а затем переориентируется обратно в правильное положение. Если первое значение не является NaN, запустите код скользящего среднего.

if df.isnull().loc[3,6] == 'True':
    df['rollmean5'] = df[6].loc[::-1].rolling(5,center=False,min_periods=1).mean()
    df['rollmean5'] = df['rollmean5'].loc[::-1]
    df[6] = df[6].fillna(round(df['rollmean5'],2))
else:
    df['rollmean5'] = df[6].rolling(5,center=False,min_periods=1).mean()
    df[6] = df[6].fillna(round(df['rollmean5'],2))
0 голосов
/ 09 января 2019

Это должно работать? Не уверен, что что-то уже встроено в панд. Приходилось игнорировать случаи, когда нет 4 предыдущих строк.

for i in df.index:
    if i < 4:
        pass
    else:
        df['6'].fillna(df.iloc[i-4:i,5].mean(), inplace=True)

Обратите внимание, что ваш столбец 6 действительно имеет индекс 5, поэтому iloc использует 5 для столбца.

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