#python #dataframe #nan #mean
Вопрос:
Я пытаюсь вычислить среднее значение для каждого столбца в фрейме данных, который состоит из массивов [x,y,z]
. Кроме того, массивы могут быть заполнены значениями NaN [np.nan, np.nan, np.nan].
, я пробовал это:
np.mean([df[col].mean() for col in df.columns], axis=0)
Но это не сработало :/
Любое предложение будет оценено по достоинству
Комментарии:
1. Возможно, было бы лучше
explode
разбить массивы на ячейки с одним значением.
Ответ №1:
Ты это имеешь в виду?
df=pd.DataFrame({'score1':[2010,np.nan,2010,2011,2011,2011],
'score2':[1,2,np.nan,1,2,3],
'score3':[np.nan,np.nan,32,14,15,16]})
print([df[col].mean() for col in df.columns])
Выход
[2010.6, 1.8, 19.25]
Комментарии:
1. Да, это то, чего я пытаюсь достичь. Но вместо бывшего. «год»[2010,np.nan,2010,2011,2011,2011] У меня есть «год»[массив[nan,nan,nan],массив[12,10,8],массив[nan,nan,nan] и т. Д.]
2. Было бы понятнее, если бы вы могли показать свой пример в вопросе?
Ответ №2:
Предполагая, что ваш фрейм данных выглядит примерно так:
import pandas as pd
import numpy as np
data = {"foobar":["foo", "bar", "baz"],
"year":[[np.nan,np.nan,np.nan],
[12,10,8],
[np.nan,np.nan,np.nan]]}
df = pd.DataFrame(data)
foobar year
0 foo [nan, nan, nan]
1 bar [12, 10, 8]
2 baz [nan, nan, nan]
…вы можете построить новый столбец со средними значениями, используя apply
:
df["means"] = df.year.apply(np.mean)
result_list = df.means.values # array([nan, 10., nan])
foobar year means
0 foo [nan, nan, nan] NaN
1 bar [12, 10, 8] 10.0
2 baz [nan, nan, nan] NaN
Однако, в зависимости от того, что еще вы хотите сделать со своими данными, возможно, было бы лучше explode
разбить последовательности на отдельные ячейки, чтобы получить гораздо более пандескую структуру:
df = df.explode(column="year")
df["year"] = df.year.astype(float) # tell Pandas it's numerical data
foobar year
0 foo NaN
0 foo NaN
0 foo NaN
1 bar 12.0
...
Теперь просто используйте операции по умолчанию, чтобы сгруппировать значения по foobar
или как там называется ваш столбец.
mean_df = df.groupby("foobar").mean()
year
foobar
bar 10.0
baz NaN
foo NaN