Ошибки вычисления среднего значения pandas

I’m trying to implement some machine learning algorithms, but I’m having some difficulties putting the data together.

In the example below, I load a example data-set from UCI, remove lines with missing data (thanks to the help from a previous question), and now I would like to try to normalize the data.

For many datasets, I just used:

valores = (valores - valores.mean()) / (valores.std())

But for this particular dataset the approach above doesn’t work. The problem is that the mean function is returning inf, perhaps due to a precision issue. See the example below:

bcw = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data', header=None)

for col in bcw.columns:
    if bcw[col].dtype != 'int64':
        print "Removendo possivel '?' na coluna %s..." % col
        bcw = bcw[bcw[col] != '?']

valores = bcw.iloc[:,1:10]
#mean return inf
print  valores.iloc[:,5].mean()

My question is how to deal with this. It seems that I need to change the type of this column, but I don’t know how to do it.

  • Чтобы вычислить среднее значение в Pandas DataFrame, вы можете использовать метод pandas.DataFrame.mean(). Используя метод mean(), вы можете вычислить среднее значение по оси или по всему DataFrame.

Пример 1

В этом примере мы рассчитаем среднее значение по столбцам. Мы узнаем средние оценки, полученные студентами по предметам.

import pandas as pd

mydictionary = {'names': ['Somu', 'Kiku', 'Amol', 'Lini'],
	'physics': [68, 74, 77, 78],
	'chemistry': [84, 56, 73, 69],
	'algebra': [78, 88, 82, 87]}

# create dataframe
df_marks = pd.DataFrame(mydictionary)
print('DataFramen----------')
print(df_marks)

# calculate mean
mean = df_marks.mean()
print('nMeann------')
print(mean)

Вывод:

DataFrame
----------
  names  physics  chemistry  algebra
0  Somu       68         84       78
1  Kiku       74         56       88
2  Amol       77         73       82
3  Lini       78         69       87

Mean
------
physics      74.25
chemistry    70.50
algebra      83.75
dtype: float64

Функция mean() возвращает Pandas, это поведение функции mean() по умолчанию. Следовательно, в этом конкретном случае вам не нужно передавать какие-либо аргументы функции mean(). Или, если вы хотите явно указать функцию для вычисления по столбцам, передайте axis = 0, как показано ниже.

df_marks.mean(axis=0)

Пример 2

В этом примере мы создадим DataFrame с числами, присутствующими во всех столбцах, и вычислим среднее значение.

Из предыдущего примера мы видели, что функция mean() по умолчанию возвращает среднее значение, вычисленное среди столбцов.

import pandas as pd

mydictionary = {'names': ['Somu', 'Kiku', 'Amol', 'Lini'],
	'physics': [68, 74, 77, 78],
	'chemistry': [84, 56, 73, 69],
	'algebra': [78, 88, 82, 87]}

# create dataframe
df_marks = pd.DataFrame(mydictionary)
print('DataFramen----------')
print(df_marks)

# calculate mean of the whole DataFrame
mean = df_marks.mean().mean()
print('nMeann------')
print(mean)

Вывод:

DataFrame
----------
  names  physics  chemistry  algebra
0  Somu       68         84       78
1  Kiku       74         56       88
2  Amol       77         73       82
3  Lini       78         69       87

Mean
------
76.16666666666667

Пример 3: по строкам

В этом примере мы вычислим среднее значение всех столбцов по строкам или оси = 1. В этом конкретном примере среднее значение по строкам дает среднее значение или процент оценок, полученных каждым учеником.

import pandas as pd

mydictionary = {'names': ['Somu', 'Kiku', 'Amol', 'Lini'],
	'physics': [68, 74, 77, 78],
	'chemistry': [84, 56, 73, 69],
	'algebra': [78, 88, 82, 87]}

# create dataframe
df_marks = pd.DataFrame(mydictionary)
print('DataFramen----------')
print(df_marks)

# calculate mean along rows
mean = df_marks.mean(axis=1)
print('nMeann------')
print(mean)

# display names and average marks
print('nAverage marks or percentage for each student')
print(pd.concat([df_marks['names'], mean], axis=1))

Вывод:

DataFrame
----------
  names  physics  chemistry  algebra
0  Somu       68         84       78
1  Kiku       74         56       88
2  Amol       77         73       82
3  Lini       78         69       87

Mean
------
0    76.666667
1    72.666667
2    77.333333
3    78.000000
dtype: float64

Average marks or percentage for each student
  names          0
0  Somu  76.666667
1  Kiku  72.666667
2  Amol  77.333333
3  Lini  78.000000

В этом руководстве по Pandas мы узнали, как рассчитать среднее значение всего DataFrame, по столбцу (столбцам) и строкам.

I’m trying to implement some machine learning algorithms, but I’m having some difficulties putting the data together.

In the example below, I load a example data-set from UCI, remove lines with missing data (thanks to the help from a previous question), and now I would like to try to normalize the data.

For many datasets, I just used:

valores = (valores - valores.mean()) / (valores.std())

But for this particular dataset the approach above doesn’t work. The problem is that the mean function is returning inf, perhaps due to a precision issue. See the example below:

bcw = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data', header=None)

for col in bcw.columns:
    if bcw[col].dtype != 'int64':
        print "Removendo possivel '?' na coluna %s..." % col
        bcw = bcw[bcw[col] != '?']

valores = bcw.iloc[:,1:10]
#mean return inf
print  valores.iloc[:,5].mean()

My question is how to deal with this. It seems that I need to change the type of this column, but I don’t know how to do it.

I’m trying to calculate the mean of all the columns of a DataFrame but it looks like having a value in the B column of row 6 prevents from calculating the mean on the C column. Possible bug? (pandas: 0.17.1)

import pandas as pd
from decimal import Decimal
d = [
    {'A': 2, 'B': None, 'C': Decimal('628.00')},
    {'A': 1, 'B': None, 'C': Decimal('383.00')},
    {'A': 3, 'B': None, 'C': Decimal('651.00')},
    {'A': 2, 'B': None, 'C': Decimal('575.00')},
    {'A': 4, 'B': None, 'C': Decimal('1114.00')},
    {'A': 1, 'B': 'TEST', 'C': Decimal('241.00')},
    {'A': 2, 'B': None, 'C': Decimal('572.00')},
    {'A': 4, 'B': None, 'C': Decimal('609.00')},
    {'A': 3, 'B': None, 'C': Decimal('820.00')},
    {'A': 5, 'B': None, 'C': Decimal('1223.00')}
]

df = pd.DataFrame(d)

In : df
Out:
   A     B        C
0  2  None   628.00
1  1  None   383.00
2  3  None   651.00
3  2  None   575.00
4  4  None  1114.00
5  1  TEST   241.00
6  2  None   572.00
7  4  None   609.00
8  3  None   820.00
9  5  None  1223.00

dtypes are equivalent:

In : df.dtypes
Out:
A     int64
B    object
C    object
dtype: object

In : df.head(5).dtypes
Out:
A     int64
B    object
C    object
dtype: object

But calling mean on the dataframe does not work when row 6 is present:

# no mean for C column: row 6 is present
In : df.mean()
Out:
A    2.7
dtype: float64

# mean for C column when row 6 is left out of the DF
In : df.head(5).mean()
Out:
A      2.4
B      NaN
C    670.2
dtype: float64

# no mean for C column when row 6 is part of the DF
In : df.head(6).mean()
Out:
A    2.166667
dtype: float64

Also, it works when I explicitely leave out column B for calculating the mean:

In : df[['A','B','C']].mean()
Out:
A    2.7
dtype: float64

In : df[['A','C']].mean()
Out:
A      2.7
C    681.6
dtype: float64
  • Редакция Кодкампа

17 авг. 2022 г.
читать 1 мин


Часто вам может быть интересно вычислить среднее значение одного или нескольких столбцов в кадре данных pandas. К счастью, вы можете легко сделать это в pandas, используя функцию mean() .

В этом руководстве показано несколько примеров использования этой функции.

Пример 1. Найдите среднее значение одного столбца

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd
import numpy as np

#create DataFrame
df = pd.DataFrame({'player': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
 'points': [25, 20, 14, 16, 27, 20, 12, 15, 14, 19],
 'assists': [5, 7, 7, 8, 5, 7, 6, 9, 9, 5],
 'rebounds': [np.nan, 8, 10, 6, 6, 9, 6, 10, 10, 7]})

#view DataFrame 
df

 player points assists rebounds
0 A 25 5 NaN
1 B 20 7 8.0
2 C 14 7 10.0
3 D 16 8 6.0
4 E 27 5 6.0
5 F 20 7 9.0
6 G 12 6 6.0
7 H 15 9 10.0
8 I 14 9 10.0
9 J 19 5 7.0

Мы можем найти среднее значение столбца под названием «точки», используя следующий синтаксис:

df['points'].mean()

18.2

Функция mean() также будет исключать NA по умолчанию. Например, если мы найдем среднее значение столбца «отскоки», первое значение «NaN» будет просто исключено из расчета:

df['rebounds'].mean()

8.0

Если вы попытаетесь найти среднее значение столбца, который не является числовым, вы получите сообщение об ошибке:

df['player'].mean()

TypeError: Could not convert ABCDEFGHIJ to numeric

Пример 2. Найдите среднее значение нескольких столбцов

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

#find mean of points and rebounds columns
df[['rebounds', 'points']].mean()

rebounds 8.0
points 18.2
dtype: float64

Пример 3. Найдите среднее значение всех столбцов

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

#find mean of all numeric columns in DataFrame
df.mean ()

points 18.2
assists 6.8
rebounds 8.0
dtype: float64

Обратите внимание, что функция mean() просто пропустит столбцы, которые не являются числовыми.

Дополнительные ресурсы

Как рассчитать медиану в Pandas
Как рассчитать сумму столбцов в Pandas
Как найти максимальное значение столбцов в Pandas

  • Ошибки выступающих ошибки при подготовке презентации
  • Ошибки выступающего перед аудиторией
  • Ошибки выращивания рассады томатов
  • Ошибки выравнивания ногтевой пластины базой
  • Ошибки выполняемые игроками при подаче