Получить среднее значение для нескольких выбранных столбцов в pandas кадре данных - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу вычислить среднее значение всех значений в выбранных столбцах в кадре данных. Например, у меня есть кадр данных со столбцами A, B, C, D и E, и я хочу получить среднее значение всех значений в столбцах A, C и E.

import pandas as pd

df1 = pd.DataFrame( ( {'A': [1,2,3,4,5],
                      'B': [10,20,30,40,50],
                      'C': [11,21,31,41,51],
                      'D': [12,22,32,42,52],
                      'E': [13,23,33,43,53]} ) )

print( df1 )

print( "Mean of df1:", df1.mean() )

df2 = pd.concat( [df1['A'], df1['C'], df1['E'] ], ignore_index=True )
print( df2 )
print( "Mean of df2:", df2.mean() )

df3 = pd.DataFrame()
df3 = pd.concat( [ df3, df1['A'] ], ignore_index=True )
df3 = pd.concat( [ df3, df1['C'] ], ignore_index=True )
df3 = pd.concat( [ df3, df1['E'] ], ignore_index=True )
print( df3 )
print( "Mean of df3:", df3.mean() )

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

Я бы хоть что-то вроде df1['A', 'C', 'E'].mean() работал, но он возвращает средние значения для каждого столбца, а не объединенное среднее. Есть ли способ сделать это без создания нового кадра данных? Мне также нужны другие статистические данные, такие как .std (), .min (), max (), так что это не однократный расчет.

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Предупреждение: хорошо, только если столбцы имеют одинаковую длину. В противном случае это дало бы неправильный ответ (как отмечалось в комментариях).

mean = df1[['A', 'C', 'E']].mean(axis=1).mean()    
print(mean)
1 голос
/ 25 апреля 2020

Вы можете изменить DataFrame до Series with Multiindex на DataFrame.stack, а затем использовать mean:

df2 = df1[['A', 'C', 'E']].stack()
print (df2)
0  A     1
   C    11
   E    13
1  A     2
   C    21
   E    23
2  A     3
   C    31
   E    33
3  A     4
   C    41
   E    43
4  A     5
   C    51
   E    53
dtype: int64

print( "Mean of df2:", df2.mean() )
Mean of df2: 22.333333333333332

Другая идея - преобразовать значения в массив numpy 2d и затем используйте np.mean:

df21 = df1[['A', 'C', 'E']]
print( df21 )
   A   C   E
0  1  11  13
1  2  21  23
2  3  31  33
3  4  41  43
4  5  51  53

print(df21.to_numpy())
[[ 1 11 13]
 [ 2 21 23]
 [ 3 31 33]
 [ 4 41 43]
 [ 5 51 53]]

print( "Mean of df2:", np.mean(df21.to_numpy()) )
Mean of df2: 22.333333333333332
0 голосов
/ 25 апреля 2020

У меня есть два варианта, о которых я знаю:

для среднего значения (), min (), max () вы можете использовать среднее значение среднего значения, минимальное значение min, максимальное значение max. min, max всех элементов A, C, E.

Таким образом, вы можете использовать: для mean (): enter code here

df1[['A','C','E']].apply(np.mean).mean()
df1[['A','C','E']].values.mean() 

Любой из вышеперечисленных должен дать среднее значение для всех элементов столбцов A, C, E.

для min ():

df1[['A','C','E']].apply(np.min).min()
df1[['A','C','E']].values.min()  

Для max ():

df1[['A','C','E']].apply(np.max).max()
df1[['A','C','E']].values.max() 

Для std ()

df1[['A','C','E']].apply(np.std).std()    ##  this will not give error, but gives a 
                       value that is not what you want.
df1[['A','C','E']].values.std()    # this gives the std of all the elements of columns A, C, E.

std из std не даст std всех элементов.

...