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