У меня есть датафрейм в формате ниже:
Original Dataframe
| x | value1 | value2 | value3 | value4
---|-----|----------|----------|----------|-----------
0 | 1 | 1 | NaN | 3 | 1
1 | 2 | 4 | NaN | 1 | NaN
2 | 3 | 2 | 6 | 1 | 2
3 | 4 | 1 | 1 | 2 | 1
Моя цель - найти среднее значение для каждой строки, отбрасывая NaN, а также устраняя выбросы. Цель состоит в том, чтобы получить новый фрейм данных в следующем формате:
Desired Dataframe
| x | mean (after dropping the NaN and the outliers)*
---|-----|--------
0 | 1 | a
1 | 2 | b
2 | 3 | c
3 | 4 | d
* Обратите внимание, что a, b, c, d - это средние значения (я не рассчитывал результат)
Конечная цель после достижения результата - напечатать график значений во времени.
Работая с одним списком значений, например, эквивалентным одному столбцу значений и одному столбцу индексов, я могу выполнять все операции: отбрасывать NaN, вычислять Z-счет и затем возвращать список значений, как показано ниже:
import pandas as pd
import numpy as np
from scipy import stats
data = {'value': [1, 2, 15, np.NaN, 2, 2, 2, 3, 1, 1],
'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
df = pd.DataFrame(data)
df.dropna(inplace=True)
df = df[(np.abs(stats.zscore(df['return'])) < 2)]
Есть несколько проблем, которые возникают, когда я пытаюсь работать в натуральном выражении (и я уверен, что они возникают, потому что я привык программировать, используя циклы, и должен быть «умный» способ сделать эту операцию в Pandas. )
Я не могу рассчитать Z балл, когда есть значение NaN. Я получил эту ошибку:
/home/jupyterlab/conda/lib/python3.6/site-packages/ipykernel_launcher.py:14: RuntimeWarning: invalid value encountered in less
Итак, я знаю, что мне нужно устранить NaN. Но я не могу сделать это в этом формате данных, поскольку это приведет к исключению строки или столбца, что приведет к потере информации.
Другой подход, который я попытался безуспешно, состоял в том, чтобы преобразовать эту таблицу в длинную форму, что означало бы:
| x | valueName | actualValue
---|-----|-------------|--------------
0 | 1 | value1 | 1
1 | 1 | value2 | NaN
... ... ... ...
2 | 2 | value2 | 4
3 | 2 | value2 | NaN
Это заставило меня бросить Нан, но использовать Z-счет было более проблематично. Я уверен, что это общая проблема, но я не могу понять, как ее решить.