Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7615.pdf
Скачиваний:
2
Добавлен:
23.11.2023
Размер:
1.17 Mб
Скачать

Работа с колонками и строками DataFrame

Вы можете получить доступ к данным DataFrame, используя знакомые операции

Python dict/list:

cities = pd.DataFrame({ 'City name': city_names, 'Population': population }) print(type(cities['City name']))

cities['City name']

<class 'pandas.core.series.Series'>

0San Francisco

1San Jose

2Sacramento

Name: City name, dtype: object print(type(cities['City name'][1])) cities['City name'][1]

<class 'str'> {"type":"string"} print(type(cities[0:2])) cities[0:2]

<class 'pandas.core.frame.DataFrame'>

 

City name Population

0

San Francisco

852469

1

San Jose

1015785

Кроме того, pandas предоставляет чрезвычайно богатый API для расширенного доступа по индексам и колонкам.

Манипулирование данными

Возможно применить основные арифметические операции Python к Series. Например: population / 1000.

0852.469

11015.785

2485.199 dtype: float64

NumPy — популярный инструментарий для научных вычислений. pandas Series можно использовать в качестве аргументов для большинства функций NumPy:

import numpy as np

np.log(population)

26

013.655892

113.831172

213.092314

dtype: float64

Для более сложных одностолбцовых преобразований вы можете использовать

Series.apply. Как Python функция сопоставления (map function), Series.apply принимает в качестве аргумента lambda функцию, которая применяется к каждому значению. В приведенном ниже примере создается новая Series, которая указывает, превышает ли population один миллион:

population.apply(lambda val: val > 1000000)

0False

1True

2False dtype: bool

Изменение DataFrames также просто. Например, следующий код добавляет два Series к существующему DataFrame:

cities['Area square miles'] = pd.Series([46.87, 176.53, 97.92]) cities['Population density'] = cities['Population'] / cities['Area square miles']

cities

 

 

 

 

City name Population Area square miles

Population density

0 San Francisco

852469

46.87

18187.945381

1

San Jose

1015785

176.53

5754.177760

2

Sacramento

485199

97.92

4955.055147

bold text## Упражнение #1

Измените таблицу cities, добавив новый логический столбец, который имеет значение True тогда и только тогда, когда оба следующих условия верны:

Город назван в честь святого.

Площадь города превышает 50 квадратных миль.

Примечание. Логические Series объединяются с использованием побитовых, а не традиционных логических операторов. Например, при выполнении логического И используйте & вместо and.

Подсказка. 'San' по-испански означает 'святой (saint)'.

# Ваш код здесь

Решение

Щелкните ниже для просмотра решения.

cities['Is wide and has saint name'] = (cities['Area square miles'] > 50) & cities['City name'].apply(lambda name: name.startswith('San'))

cities

 

 

 

 

City name Population Area square miles

Population density \

0

San Francisco

852469

46.87

18187.945381

1

San Jose

1015785

176.53

5754.177760

2

Sacramento

485199

97.92

4955.055147

 

Is wide and has saint name

 

 

0

False

 

 

1

True

 

 

2

False

 

 

Indexes

Объекты Series и DataFrame также определяют свойство index, которое присваивает значение идентификатора каждому элементу Series или строке DataFrame.

27

По умолчанию при построении pandas присваивает значения индекса, отражающие порядок исходных данных. После создания значения индекса стабильны (неизменны), то есть они не меняются при переупорядочении данных.

city_names.index RangeIndex(start=0, stop=3, step=1) cities.index

RangeIndex(start=0, stop=3, step=1)

Вызовите DataFrame.reindex, чтобы вручную изменить порядок строк. Например, следующее имеет тот же эффект, что и сортировка по названию города: cities.reindex([2, 0, 1])

 

City name Population Area square miles

Population density \

2

Sacramento

485199

97.92

4955.055147

0

San Francisco

852469

46.87

18187.945381

1

San Jose

1015785

176.53

5754.177760

 

Is wide and has saint name

 

 

2

False

 

 

0

False

 

 

1

True

 

 

Переиндексация — отличный способ перетасовать (рандомизировать) DataFrame. В приведенном ниже примере мы берем индекс, похожий на массив, и передаем его функции random.permutation NumPy, которая перемешивает его значения на месте. Вызов reindex с этим перетасованным массивом приводит к тому, что строки DataFrame перетасовываются таким же образом. Попробуйте запустить следующую ячейку несколько раз! cities.reindex(np.random.permutation(cities.index))

 

City name Population Area square miles

Population density \

2

Sacramento

485199

97.92

4955.055147

1

San Jose

1015785

176.53

5754.177760

0

San Francisco

852469

46.87

18187.945381

 

Is wide and has saint name

 

 

2

False

 

 

1

True

 

 

0

False

 

 

Для получения дополнительной информации см..

Упражнение #2

Метод reindex позволяет использовать значения индекса, которых нет в исходных значениях индекса DataFrame. Попробуйте использовать данный метод. Как вы думаете, почему это разрешено?

# Your code here

Решение

Щелкните ниже для просмотра решения.

Если ваш входной массив reindex включает значения, не входящие в исходные значения индекса DataFrame, reindex добавит новые строки для этих «отсутствующих» индексов и заполнит все соответствующие столбцы значениями NaN:

cities.reindex([0, 4, 5, 2])

 

 

 

City name Population Area square miles

Population density \

0 San Francisco

852469.0

46.87 18187.945381

4

NaN

NaN

NaN

NaN

5

NaN

NaN

NaN

NaN

2

Sacramento

485199.0

97.92

4955.055147

28

 

Is wide and has saint name

0

False

4

NaN

5

NaN

2

False

Такое поведение желательно, потому что индексы часто представляют собой строки, взятые из фактических данных (см. pandas reindex documentation для примера в котором значения индекса являются именами браузеров).

В этом случае разрешение «отсутствующих» индексов упрощает переиндексацию с использованием внешнего списка.

Копирование DataFrame

Pandas предоставляет два разных способа дублирования DataFrame:

Referencing (ссылка). Если вы назначите DataFrame новой переменной, любое изменение в DataFrame или в новой переменной будет отражено в другом.

Copying (копирование). Если вы вызываете метод pd.DataFrame.copy, вы создаете настоящую независимую копию. Изменения исходного DataFrame или копии не будут отражены в другом.

Разница тонкая, но важная.

#Создадим список Python, содержащий имена четырех столбцов. my_column_names = ['Eleanor', 'Chidi', 'Tahani', 'Jason']

#Создадим массив 3x4 numpy, каждая ячейка которого заполнена случайным целым числом.

my_data = np.random.randint(low=0, high=101, size=(3, 4))

#Создадим DataFrame.

df = pd.DataFrame(data=my_data, columns=my_column_names)

#Вывод DataFrame print(df)

#Создайте ссылку, назначив my_dataframe новой переменной. print("Пример с сылкой:")

reference_to_df = df

#Вывод начального значения конкретной ячейки. print(" Начальное значение df: %d" % df['Jason'][1])

print(" Начальное значение reference_to_df: %d\n" % reference_to_df['Jason'][1])

#Изменение ячейки в df.

df.at[1, 'Jason'] = df['Jason'][1] + 5

print(" Обновление df: %d" % df['Jason'][1])

print(" Обновление reference_to_df: %d\n\n" % reference_to_df['Jason'][1])

#Создание настоящей копии my_dataframe print("Пример с копией df:")

copy_of_df = df.copy()

#Вывод начального значения конкретной ячейки. print(" Начальное значение df: %d" % df['Eleanor'][1])

print(" Начальное значение copy_of_df: %d\n" % copy_of_df['Eleanor'][1])

29

# Изменение ячейки в df.

df.at[1, 'Eleanor'] = df['Eleanor'][1] + 3

print(" Обновление df: %d" % df['Eleanor'][1])

print(" copy_of_df не обновился: %d" % copy_of_df['Eleanor'][1])

 

Eleanor Chidi Tahani Jason

0

30

60

44

73

1

76

15

61

56

2

80

50

64

49

Пример с сылкой: Начальное значение df: 56

Начальное значение reference_to_df: 56

Обновление df: 61

Обновление reference_to_df: 61

Пример с копией df: Начальное значение df: 76

Начальное значение copy_of_df: 76

Обновление df: 79 copy_of_df не обновился: 76

ПРАКТИЧЕСКАЯ ЧАСТЬ Задание на лабораторную работу

Для произвольного цифрового набора данных, организованного в формат листа, который состоит минимум из 5-ти колонок и 10-ти строк выполнить:

1.Циклическое суммирование значений колонок

2.Реализовать блок "исключения" для детектирования ошибки индекса листа

3.Использовать lamda функцию для перемножения всех строк одной из колонок массива

4.Создать функцию класса, принимающую на вход номера двух колонок и строчек, для выполнения последующего суммирования значений данных ячеек массива

Для произвольного цифрового набора данных, организованного в формат датафрейма, который состоит минимум из 5-ти колонок и 10-ти строк выполнить:

1.Построить гистограмму

2.Получить статистику датафрейма

3.Транспонировать датафрейм

4.Создать индекс формата DatetimeIndex

5.Суммировать значения двух любых колонок датафрейма в колонку sum

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]