6 распространенных методов очистки данных с помощью Pandas и NumPy

Python анализ данных NumPy pandas
6 распространенных методов очистки данных с помощью Pandas и NumPy

Добавить Автора
Публичный аккаунт 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数据科学, в мир данных.