Добавить Автора
Публичный аккаунт WeChat: наука о данных Python
Знаю почти:zhuanlan.zhihu.com/py...
Специалисты по данным тратят много времени на очистку наборов данных и преобразование этих данных в формат, с которым они могут работать. На самом деле, многие специалисты по данным утверждают, что начать работу и очистить данные — это 80% работы.
Поэтому, если вы оказались в этом поле или планируете его ввести, очень важно иметь дело с этими беспорядочными данными, которые включают в себя некоторые пропущенные значения, прерывистый формат, неправильные записи или бессмысленные значения аномалий.
В этом уроке мы будем использовать PythonPandas
иNumpy
пакет для очистки данных.
Основное содержание следующее:
- Удалить
DataFrame
ненужные столбцы в - Изменять
DataFrame
индекс - использовать
.str()
метод очистки столбцов - использовать
DataFrame.applymap()
Функция для очистки всего набора данных поэлементно - Столбцы переименованы в более узнаваемый набор меток.
- Отфильтровать ненужные строки в файле CSV
Вот набор данных для использования:
- BL-Flickr-Images-Book.csv- CSV-файл из британской библиотеки, содержащий информацию о книге.
- university_towns.txt- Текстовый документ, содержащий названия студенческих городков на всех континентах США.
- olympics.csv- Файл CSV с кратким описанием участия стран в летних и зимних Олимпийских играх.
ты можешь начатьReal Python
Репозиторий GitHub для загрузки набора данных для следующих примеров.
Примечание. Рекомендуется использовать ноутбуки Jupter для изучения следующего.
Перед обучением предполагается, что у вас есть базовое представление о библиотеках Pandas и Numpy, включая основы работы с Pandas.Series
иDataFrame
объекты, общие методы, применяемые к этим объектам, и знакомство с NumPyNaN
ценность.
Давайте импортируем эти модули, чтобы начать наше исследование.
>>> import pandas as pd
>>> import numpy as np
Удалить столбец DataFrame
Часто вы обнаружите, что не все типы полей в наборе данных полезны. Например, у вас может быть набор данных со сведениями об учащихся с определенной информацией, такой как имя, оценка, критерии, имя родителя, адрес и т. д., но вы хотите анализировать только оценки учащихся.
В этом случае информация об адресе или имени родителей не имеет для вас большого значения. Эта бесполезная информация занимает лишнее место и замедляет время выполнения.
Pandas предоставляет очень удобный методdrop()
Функция для удаления ненужных строк или столбцов из DataFrame. Давайте посмотрим на простом примере, как удалить столбцы из DataFrame.
Во-первых, мы вводимBL-Flickr-Images-Book.csv
файл и создать DataFrame этого файла. В следующем примере мы устанавливаемpd.read_csv
, что означает, что все наборы данных находятся вDatasets
В текущем рабочем каталоге в папке:
>>> df = pd.read_csv('Datasets/BL-Flickr-Images-Book.csv')
>>> df.head()
Identifier Edition Statement Place of Publication \
0 206 NaN London
1 216 NaN London; Virtue & Yorston
2 218 NaN London
3 472 NaN London
4 480 A new edition, revised, etc. London
Date of Publication Publisher \
0 1879 [1878] S. Tinsley & Co.
1 1868 Virtue & Co.
2 1869 Bradbury, Evans & Co.
3 1851 James Darling
4 1857 Wertheim & Macintosh
Title Author \
0 Walter Forbes. [A novel.] By A. A A. A.
1 All for Greed. [A novel. The dedication signed... A., A. A.
2 Love the Avenger. By the author of “All for Gr... A., A. A.
3 Welsh Sketches, chiefly ecclesiastical, to the... A., E. S.
4 [The World in which I live, and my place in it... A., E. S.
Contributors Corporate Author \
0 FORBES, Walter. NaN
1 BLAZE DE BURY, Marie Pauline Rose - Baroness NaN
2 BLAZE DE BURY, Marie Pauline Rose - Baroness NaN
3 Appleyard, Ernest Silvanus. NaN
4 BROOME, John Henry. NaN
Corporate Contributors Former owner Engraver Issuance type \
0 NaN NaN NaN monographic
1 NaN NaN NaN monographic
2 NaN NaN NaN monographic
3 NaN NaN NaN monographic
4 NaN NaN NaN monographic
Flickr URL \
0 http://www.flickr.com/photos/britishlibrary/ta...
1 http://www.flickr.com/photos/britishlibrary/ta...
2 http://www.flickr.com/photos/britishlibrary/ta...
3 http://www.flickr.com/photos/britishlibrary/ta...
4 http://www.flickr.com/photos/britishlibrary/ta...
Shelfmarks
0 British Library HMNTS 12641.b.30.
1 British Library HMNTS 12626.cc.2.
2 British Library HMNTS 12625.dd.1.
3 British Library HMNTS 10369.bbb.15.
4 British Library HMNTS 9007.d.28.
мы использовалиhead()
Метод получает первые пять строк информации, эти столбцы предоставляют полезную вспомогательную информацию для библиотеки, но не очень хорошо описывают книги:Edition Statement
, Corporate Author
, Corporate Contributors
, Former owner
, Engraver
, Issuance type and Shelfmarks
.
Следовательно, мы можем удалить эти столбцы следующим образом:
>>> to_drop = ['Edition Statement',
... 'Corporate Author',
... 'Corporate Contributors',
... 'Former owner',
... 'Engraver',
... 'Contributors',
... 'Issuance type',
... 'Shelfmarks']
>>> df.drop(to_drop, inplace=True, axis=1)
Выше мы определяем список имен, содержащих столбцы, которые нам не нужны. Далее мы вызываем объектdrop()
функция, гдеinplace
параметрTrue
,axis
параметр1
. Это сообщает Pandas, что мы хотим внести изменения непосредственно в наш объект, и он должен иметь возможность искать информацию об удаленных столбцах в объекте.
Если мы снова посмотрим на DataFrame, то увидим, что нежелательная информация была удалена.
>>> df.head()
Identifier Place of Publication Date of Publication \
0 206 London 1879 [1878]
1 216 London; Virtue & Yorston 1868
2 218 London 1869
3 472 London 1851
4 480 London 1857
Publisher Title \
0 S. Tinsley & Co. Walter Forbes. [A novel.] By A. A
1 Virtue & Co. All for Greed. [A novel. The dedication signed...
2 Bradbury, Evans & Co. Love the Avenger. By the author of “All for Gr...
3 James Darling Welsh Sketches, chiefly ecclesiastical, to the...
4 Wertheim & Macintosh [The World in which I live, and my place in it...
Author Flickr URL
0 A. A. http://www.flickr.com/photos/britishlibrary/ta...
1 A., A. A. http://www.flickr.com/photos/britishlibrary/ta...
2 A., A. A. http://www.flickr.com/photos/britishlibrary/ta...
3 A., E. S. http://www.flickr.com/photos/britishlibrary/ta...
4 A., E. S. http://www.flickr.com/photos/britishlibrary/ta...
Точно так же мы можем также датьcolumns
Присвоение параметра напрямую удаляет столбцы без отдельного определения списка to_drop и оси.
>>> df.drop(columns=to_drop, inplace=True)
Этот синтаксис более интуитивно понятен и удобочитаем. Очевидно, что мы собираемся здесь делать.
Изменить индекс DataFrame
Индекс пандindex
Функциональность массивов Numpy была расширена, чтобы обеспечить более разнообразную сегментацию и маркировку. Во многих случаях полезно идентифицировать поля данных с уникальными значениями как значения индекса.
Например, все еще используя набор данных из предыдущего раздела, представьте, что, когда библиотекарь ищет запись, он может ввести уникальный идентификатор, чтобы найти книгу.
>>> df['Identifier'].is_unique
True
давайте использоватьset_index
Измените существующий индекс на этот столбец.
>>> df = df.set_index('Identifier')
>>> df.head()
Place of Publication Date of Publication \
206 London 1879 [1878]
216 London; Virtue & Yorston 1868
218 London 1869
472 London 1851
480 London 1857
Publisher \
206 S. Tinsley & Co.
216 Virtue & Co.
218 Bradbury, Evans & Co.
472 James Darling
480 Wertheim & Macintosh
Title Author \
206 Walter Forbes. [A novel.] By A. A A. A.
216 All for Greed. [A novel. The dedication signed... A., A. A.
218 Love the Avenger. By the author of “All for Gr... A., A. A.
472 Welsh Sketches, chiefly ecclesiastical, to the... A., E. S.
480 [The World in which I live, and my place in it... A., E. S.
Flickr URL
206 http://www.flickr.com/photos/britishlibrary/ta...
216 http://www.flickr.com/photos/britishlibrary/ta...
218 http://www.flickr.com/photos/britishlibrary/ta...
472 http://www.flickr.com/photos/britishlibrary/ta...
480 http://www.flickr.com/photos/britishlibrary/ta...
Технические подробности: в отличие от первичных ключей в SQL, индексы pandas не гарантируют уникальность, хотя в этом случае многие операции индексирования и слияния будут выполняться дольше.
Мы можем использовать прямой методloc[]
чтобы получить каждую запись. несмотря на то чтоloc[]
Это слово может показаться не таким интуитивно понятным, но оно позволяет нам использоватьна основе теговИндекс этого индекса является меткой строки или записи независимо от позиции.
>>> df.loc[206]
Place of Publication London
Date of Publication 1879 [1878]
Publisher S. Tinsley & Co.
Title Walter Forbes. [A novel.] By A. A
Author A. A.
Flickr URL http://www.flickr.com/photos/britishlibrary/ta...
Name: 206, dtype: object
Другими словами, 206 — это первая метка индекса. Если мы хотим получить его по местоположению, мы можем использоватьdf.iloc[0]
,Является基于位置
индекс чего-либо.
Раньше наш индекс был индексом диапазона: целым числом, отсчитываемым от 0, подобно встроенному в Pythonrange
. Даваяset_index
Имя столбца, мы превращаем индекс вIdentifier
значение в .
Вы, наверное, заметили, что мы прошлиdf = df.set_index(...)
Возвращаемой переменной объекта переназначается ее значение. Это связано с тем, что по умолчанию этот метод возвращает копию измененного объекта и не вносит никаких изменений напрямую в исходный объект. Мы можем установить параметры с помощьюinplace
чтобы избежать этой проблемы.
df.set_index('Identifier', inplace=True)
Очистить поля данных
К настоящему времени мы удалили ненужные столбцы и изменили наш индекс, чтобы сделать его более понятным. В этом разделе мы очистим специальные столбцы и приведем их к единому формату, что поможет лучше понять набор данных и укрепить преемственность. Спец, мы почистимDate of Publication
иPlace of Publication
.
Согласно приведенному выше наблюдению, присутствуют все типы данныхobject
Тип dtype, почти аналогичный str в Python.
Он содержит некоторые данные, которые нельзя применить численно или категорически. Это тоже хорошо, поскольку мы имеем дело с данными, начальное значение которых представляет собой просто набор строк.
>>> df.get_dtype_counts()
object 6
Поле, которое необходимо изменить на значение,the date of publication
Итак, мы делаем следующее:
>>> df.loc[1905:, 'Date of Publication'].head(10)
Identifier
1905 1888
1929 1839, 38-54
2836 [1897?]
2854 1865
2956 1860-63
2957 1873
3017 1866
3131 1899
4598 1814
4884 1820
Name: Date of Publication, dtype: object
У книги может быть только одна дата публикации.data of publication
. Поэтому нам нужно сделать следующие вещи:
- Удалите лишнюю дату в квадратных скобках, если она есть: 1879[1878].
- Преобразуйте диапазоны дат в их начальные даты, любые существующие: 1860-63;1839,38-54.
- Полностью удалите даты, которые нам не нужны, и используйте Numpy.
NaN
Замена: [1879?]. - преобразовать строку
nan
Преобразовать в NumpyNaN
ценность.
Учитывая эти шаблоны, мы можем извлечь дату публикации с помощью простого регулярного выражения:
regex = r'^(\d{4})'
Приведенное выше регулярное выражение означает поиск любого четырехзначного числа в начале строки, что соответствует нашему случаю.
\d
обозначает любое число,{4}
Повторите это правило четыре раза.^
Символ соответствует самому началу строки, а скобки обозначают группировку, намекая пандам, что мы хотим извлечь часть регулярного выражения.
Давайте посмотрим, что произойдет после запуска этого регулярного набора данных.
>>> extr = df['Date of Publication'].str.extract(r'^(\d{4})', expand=False)
>>> extr.head()
Identifier
206 1879
216 1868
218 1869
472 1851
480 1857
Name: Date of Publication, dtype: object
На самом деле эта колонка до сих порobject
тип, но мы можем использоватьpd.to_numeric
Легко получить цифровую версию:
>>> df['Date of Publication'] = pd.to_numeric(extr)
>>> df['Date of Publication'].dtype
dtype('float64')
В этом результате отсутствует около 1 из 10 значений, что заставляет нас платить небольшую цену за вычисление оставшихся допустимых значений.
>>> df['Date of Publication'].isnull().sum() / len(df)
0.11717147339205986
Объединение метода str с очищающей колонкой Numpy
Выше вы можете наблюдатьdf['Date of Publication'].str.
использование. Этот атрибут — способ ускорить манипуляции со строками в pandas, и есть много небольших операций со строками Python или скомпилированными регулярными выражениями, например..split()
,.replace()
,и.capitalize()
.
для уборкиPlace of Publication
поля, мы можем комбинировать панды'str
методы и numpynp.where
Координация функций завершена.
Его синтаксис следующий:
>>> np.where(condition, then, else)
здесь,condition
Может быть массивоподобным объектом или логическим выражением. еслиcondition
значение истинно, тоthen
будет использоваться, в противном случае используйтеelse
.
Его также можно использовать в сети, что позволяет нам выполнять вычисления на основе нескольких условий.
>>> np.where(condition1, x1,
np.where(condition2, x2,
np.where(condition3, x3, ...)))
Мы будем использовать эти два уравнения для очисткиPlace of Publication
Так как этот столбец имеет строковые объекты. Вот содержимое этой колонки:
>>> df['Place of Publication'].head(10)
Identifier
206 London
216 London; Virtue & Yorston
218 London
472 London
480 London
481 London
519 London
667 pp. 40. G. Bryan & Co: Oxford, 1898
874 London]
1143 London
Name: Place of Publication, dtype: object
Мы видим, что для некоторых строкplace of publication
Также в окружении какой-то другой бесполезной информации. Если мы посмотрим на другие значения, мы увидим несколько строк в этом случае.
Рассмотрим два специальных:
>>> df.loc[4157862]
Place of Publication Newcastle-upon-Tyne
Date of Publication 1867
Publisher T. Fordyce
Title Local Records; or, Historical Register of rema...
Author T. Fordyce
Flickr URL http://www.flickr.com/photos/britishlibrary/ta...
Name: 4157862, dtype: object
>>> df.loc[4159587]
Place of Publication Newcastle upon Tyne
Date of Publication 1834
Publisher Mackenzie & Dent
Title An historical, topographical and descriptive v...
Author E. (Eneas) Mackenzie
Flickr URL http://www.flickr.com/photos/britishlibrary/ta...
Name: 4159587, dtype: object
Обе книги опубликованы в одном месте, но в одной есть дефис, а в другой нет.
Чтобы очистить эту колонку за один раз, мы используемstr.contains()
чтобы получить логическое значение.
Колонны, которые мы чистим, следующие:
>>> pub = df['Place of Publication']
>>> london = pub.str.contains('London')
>>> london[:5]
Identifier
206 True
216 True
218 True
472 True
480 True
Name: Place of Publication, dtype: bool
>>> oxford = pub.str.contains('Oxford')
мы связываем это сnp.where
комбинировать.
df['Place of Publication'] = np.where(london, 'London',
np.where(oxford, 'Oxford',
pub.str.replace('-', ' ')))
>>> df['Place of Publication'].head()
Identifier
206 London
216 London
218 London
472 London
480 London
Name: Place of Publication, dtype: object
здесь,np.where
Уравнения вызываются во вложенной структуре,condition
пропускst.contains()
получить логическое значениеSeries
.contains()
методы со встроенными в Pythonin
Как и ключевые слова, он используется, чтобы узнать, встречается ли человек в итераторе.
Используемый суррогат — это строка, представляющая желаемый адрес издателя. мы также используемstr.replace()
Замените дефисы пробелами и переназначьте столбцы в DataFrame.
Хотя в наборе данных больше грязных данных, мы пока обсудим только эти два столбца.
Давайте взглянем на первые пять строк, которые сейчас выглядят немного лучше, чем когда мы только начинали.
>>> df.head()
Place of Publication Date of Publication Publisher \
206 London 1879 S. Tinsley & Co.
216 London 1868 Virtue & Co.
218 London 1869 Bradbury, Evans & Co.
472 London 1851 James Darling
480 London 1857 Wertheim & Macintosh
Title Author \
206 Walter Forbes. [A novel.] By A. A AA
216 All for Greed. [A novel. The dedication signed... A. A A.
218 Love the Avenger. By the author of “All for Gr... A. A A.
472 Welsh Sketches, chiefly ecclesiastical, to the... E. S A.
480 [The World in which I live, and my place in it... E. S A.
Flickr URL
206 http://www.flickr.com/photos/britishlibrary/ta...
216 http://www.flickr.com/photos/britishlibrary/ta...
218 http://www.flickr.com/photos/britishlibrary/ta...
472 http://www.flickr.com/photos/britishlibrary/ta...
480 http://www.flickr.com/photos/britishlibrary/ta...
С этой точки зрения,Place of Publication
— хороший тип, который необходимо преобразовать в категориальные данные, поскольку мы можем закодировать этот довольно небольшой набор уникальных городов целыми числами. (Память, используемая для категориальных данных, пропорциональна количеству категорий и длине данных)
использоватьapplymap
метод очистки всего набора данных
При определенных обстоятельствах вы увидите, что загрязнен не один столбец, а больше.
В некоторых случаях будет полезно использовать пользовательскую функцию для каждого элемента DataFrame.pandas
изapplyma()
методы и встроенныеmap()
функции аналогичны и просто применяются кDataFrame
на всех элементах в .
Давайте посмотрим на пример. Мы создадим его на основе файла «university_towns.txt».DataFrame
.
$ head Datasets/univerisity_towns.txt
Alabama[edit]
Auburn (Auburn University)[1]
Florence (University of North Alabama)
Jacksonville (Jacksonville State University)[2]
Livingston (University of West Alabama)[2]
Montevallo (University of Montevallo)[2]
Troy (Troy University)[2]
Tuscaloosa (University of Alabama, Stillman College, Shelton State)[3][4]
Tuskegee (Tuskegee University)[5]
Alaska[edit]
Мы видим, что за каждым штатом есть несколько студенческих городков в этом штате:StateA TownA1 TownA2 StateB TownB1 TownB2...
. Если мы внимательно посмотрим, как пишутся имена состояний, мы обнаружим, что все они имеют собственную строку «[edit]».
Мы можем использовать эту функцию для создания(state,city)
список кортежей и вставить этот список вDdataFrame
середина,
>>> university_towns = []
>>> with open('Datasets/university_towns.txt') as file:
... for line in file:
... if '[edit]' in line:
... # Remember this `state` until the next is found
... state = line
... else:
... # Otherwise, we have a city; keep `state` as last-seen
... university_towns.append((state, line))
>>> university_towns[:5]
[('Alabama[edit]\n', 'Auburn (Auburn University)[1]\n'),
('Alabama[edit]\n', 'Florence (University of North Alabama)\n'),
('Alabama[edit]\n', 'Jacksonville (Jacksonville State University)[2]\n'),
('Alabama[edit]\n', 'Livingston (University of West Alabama)[2]\n'),
('Alabama[edit]\n', 'Montevallo (University of Montevallo)[2]\n')]
Мы можем обернуть этот список в DataFrame с именами столбцов «State» и «RegionName». панды будут использовать каждый элемент в списке, а затем установитьState
в левую колонку,RegionName
в правую колонку.
Окончательный DataFrame выглядит так:
>>> towns_df = pd.DataFrame(university_towns,
... columns=['State', 'RegionName'])
>>> towns_df.head()
State RegionName
0 Alabama[edit]\n Auburn (Auburn University)[1]\n
1 Alabama[edit]\n Florence (University of North Alabama)\n
2 Alabama[edit]\n Jacksonville (Jacksonville State University)[2]\n
3 Alabama[edit]\n Livingston (University of West Alabama)[2]\n
4 Alabama[edit]\n Montevallo (University of Montevallo)[2]\n
Мы могли бы использовать цикл for, как указано выше, для очистки, но pandas предлагает более простой способ. Нам нужно только название штата и название города, а затем мы можем удалить все остальное. Здесь мы снова можем использовать панд.str()
метод, мы также можем использоватьapplymap()
Сопоставьте вызываемый Python с каждым элементом в DataFrame.
Мы все время используем термин «элемент», но что именно мы имеем в виду? Взгляните на следующий «игрушечный» DataFrame:
0 1
0 Mock Dataset
1 Python Pandas
2 Real Python
3 NumPy Clean
В этом примере каждая ячейка ("Mock", "Dataset", "Python", "Pandas" и т. д.) является элементом. следовательно,applymap()
К каждому из этих элементов будет применена функция. Определим эту функцию.
>>> def get_citystate(item):
... if ' (' in item:
... return item[:item.find(' (')]
... elif '[' in item:
... return item[:item.find('[')]
... else:
... return item
пандыapplymap()
Принимает только один параметр — функцию (вызываемую), которая применяется к каждому элементу.
>>> towns_df = towns_df.applymap(get_citystate)
Во-первых, мы определяем функцию, которая будет принимать каждый элемент из DataFrame в качестве собственного параметра. В этой функции проверьте, не является ли один из элементов(
или[
.
На основании проверок выше функция возвращает соответствующее значение. Наконец,applymap()
Функции используются на наших объектах. Теперь DataFrame выглядит намного чище.
>>> towns_df.head()
State RegionName
0 Alabama Auburn
1 Alabama Florence
2 Alabama Jacksonville
3 Alabama Livingston
4 Alabama Montevallo
applymap()
Метод извлекает каждый элемент из DataFrame, передает его в функцию и перезаписывает исходное значение. Это так просто!
Технические детали: Хотя.applymap
— это удобный и гибкий метод, но для больших наборов данных его выполнение займет много времени, потому что для каждого элемента требуется, чтобы к каждому элементу применялся вызываемый Python. В некоторых случаях векторизованные операции с использованием Cython или NumPY более эффективны.
Переименовать столбцы и удалить строки
Часто вы будете работать с наборами данных, в которых есть имена столбцов, которые вам трудно понять, или которые содержат неважную информацию в первых или последних нескольких строках, например определения терминов или примечания.
В этом случае мы хотим переименовать столбцы и удалить определенные строки, чтобы у нас осталась только правильная и значимая информация.
Чтобы продемонстрировать, как мы с этим справляемся, давайте посмотрим на первые 5 строк набора данных «olympics.csv»:
$ head -n 5 Datasets/olympics.csv
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
,? Summer,01 !,02 !,03 !,Total,? Winter,01 !,02 !,03 !,Total,? Games,01 !,02 !,03 !,Combined total
Afghanistan (AFG),13,0,0,2,2,0,0,0,0,0,13,0,0,2,2
Algeria (ALG),12,5,2,8,15,3,0,0,0,0,15,5,2,8,15
Argentina (ARG),23,18,24,28,70,18,0,0,0,0,41,18,24,28,70
Теперь мы читаем его в pandas DataFrame.
>>> olympics_df = pd.read_csv('Datasets/olympics.csv')
>>> olympics_df.head()
0 1 2 3 4 5 6 7 8 \
0 NaN ? Summer 01 ! 02 ! 03 ! Total ? Winter 01 ! 02 !
1 Afghanistan (AFG) 13 0 0 2 2 0 0 0
2 Algeria (ALG) 12 5 2 8 15 3 0 0
3 Argentina (ARG) 23 18 24 28 70 18 0 0
4 Armenia (ARM) 5 1 2 9 12 6 0 0
9 10 11 12 13 14 15
0 03 ! Total ? Games 01 ! 02 ! 03 ! Combined total
1 0 0 13 0 0 2 2
2 0 0 15 5 2 8 15
3 0 0 41 18 24 28 70
4 0 0 11 1 2 9 12
Это действительно немного грязно! Имена столбцов индексируются как строки целых чисел, начиная с 0. Строка, которая должна быть именем столбца, находится вolympics_df.iloc[0]
. Это происходит потому, что файл CSV начинается с 0, 1, 2, …, 15.
Точно так же, если мы перейдем к исходному файлу набора данных и посмотрим, вышеприведенноеNaN
Действительно должно быть что-то вроде "Кантри",? Summer
должно означать «Летние игры», а01 !
Это должно быть что-то вроде «Золото».
Итак, нам нужно сделать две вещи:
- Удалите первую строку и установите заголовок на первую строку
- переименовать столбец
Когда мы читаем файл CSV, мы можем передать некоторые параметры вread_csv
функции для удаления строк и установки имен столбцов.
Эта функция имеет много необязательных эвкалиптов, но здесь нам нужно толькоheader
чтобы удалить строку 0:
>>> olympics_df = pd.read_csv('Datasets/olympics.csv', header=1)
>>> olympics_df.head()
Unnamed: 0 ? Summer 01 ! 02 ! 03 ! Total ? Winter \
0 Afghanistan (AFG) 13 0 0 2 2 0
1 Algeria (ALG) 12 5 2 8 15 3
2 Argentina (ARG) 23 18 24 28 70 18
3 Armenia (ARM) 5 1 2 9 12 6
4 Australasia (ANZ) [ANZ] 2 3 4 5 12 0
01 !.1 02 !.1 03 !.1 Total.1 ? Games 01 !.2 02 !.2 03 !.2 \
0 0 0 0 0 13 0 0 2
1 0 0 0 0 15 5 2 8
2 0 0 0 0 41 18 24 28
3 0 0 0 0 11 1 2 9
4 0 0 0 0 2 3 4 5
Combined total
0 2
1 15
2 70
3 12
4 12
Теперь у нас есть правильные строки, установленные в качестве заголовков, и все ненужные строки были удалены. Задокументируйте, как панды будут включать название столбца страныNaN
изменить наUnnamed:0
из.
Чтобы переименовать столбцы, мы будем использовать DataFramerename()
метод, который позволяет вам переназначить ось с помощью карты (здесь словарь).
Начнем с определения словаря для сопоставления имен текущих столбцов (ключей) с более доступными именами столбцов (значениями словаря).
>>> new_names = {'Unnamed: 0': 'Country',
... '? Summer': 'Summer Olympics',
... '01 !': 'Gold',
... '02 !': 'Silver',
... '03 !': 'Bronze',
... '? Winter': 'Winter Olympics',
... '01 !.1': 'Gold.1',
... '02 !.1': 'Silver.1',
... '03 !.1': 'Bronze.1',
... '? Games': '# Games',
... '01 !.2': 'Gold.2',
... '02 !.2': 'Silver.2',
... '03 !.2': 'Bronze.2'}
мы вызываем объектrename()
функция:
>>> olympics_df.rename(columns=new_names, inplace=True)
настраиватьinplace
заTrue
Позволяет нашим изменениям отражаться непосредственно на объекте. Посмотрим, правильно ли:
>>> olympics_df.head()
Country Summer Olympics Gold Silver Bronze Total \
0 Afghanistan (AFG) 13 0 0 2 2
1 Algeria (ALG) 12 5 2 8 15
2 Argentina (ARG) 23 18 24 28 70
3 Armenia (ARM) 5 1 2 9 12
4 Australasia (ANZ) [ANZ] 2 3 4 5 12
Winter Olympics Gold.1 Silver.1 Bronze.1 Total.1 # Games Gold.2 \
0 0 0 0 0 0 13 0
1 3 0 0 0 0 15 5
2 18 0 0 0 0 41 18
3 6 0 0 0 0 11 1
4 0 0 0 0 0 2 3
Silver.2 Bronze.2 Combined total
0 0 2 2
1 2 8 15
2 24 28 70
3 2 9 12
4 4 5 12
Очистка данных Python: обзор
В этом уроке вы узнали, как использоватьdrop()
Функция удаляет ненужную информацию и учится индексировать набор данных, чтобы элементы можно было легко найти.
Более того, вы научились использовать.str()
Очистка полей объекта и как их использоватьapplymap
Очистите весь набор данных. Наконец, мы рассмотрели, как удалить строки из CSV-файла и использоватьrename()
способ переименовать столбец.
Освоение очистки данных очень важно, потому что это большая часть науки о данных. Теперь у вас должно быть общее представление о том, как использовать pandas и numpy для очистки данных.
Ссылаться на:realpython.com/python...
Обратите внимание на публичный аккаунт WeChatPython数据科学
, в мир данных.