Возьмите среднее значение столбца из фрейма данных, состоящего из массивов

#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