Pandas python excel поиск

Устали фильтровать данные в excel?

Есть решение, как с помощью Python осуществить поиск строк в файле по ключевым словам в столбцах.

Несомненно, многие из нас в своей работе не раз сталкивались с необходимостью фильтрации данных в файле excel, обычно мы делаем это через встроенный в программу фильтр, но бывают ситуации, когда нужно осуществить отбор строк по большому количеству условий (в нашем случае – по ключевым словам) сразу по нескольким столбцам.

Рассмотрим задачу более подробно. Например, у нас есть файл excel с обращениями клиентов в банк (тысячи строк), который содержит следующие колонки: «ИНН клиента», «Дата обращения», «Обращение», «Решение». В столбце «Обращение» содержится текст обращения клиента, в столбце «Решение» — ответ банка на обращение. Суть обращений может быть абсолютно любой (кредитование, страхование, эквайринг и т.д).

Требуется с помощью поиска ключевых слов/сочетаний слов (например, «КАСКО», «ОСАГО», «автострахов», «залог…авто» и т.п.) в колонках «Обращение» и «Решение» выбрать обращения клиентов, которые относятся к страхованию автотранспорта. Нужные слова могут содержаться как в обоих столбцах, так и в одном из них.

Конечно, можно начать фильтровать данные колонки в excel, но это будет долго и трудоёмко, особенно, если слов для поиска подходящих обращений много (или столбцов, в которых необходимо найти ключевые слова). Поэтому для решения нашей задачи требуется более удобный инструмент – Python.

Ниже представлен код, с помощью которого мы отберем необходимые обращения клиентов:

# Импорт библиотек.
import pandas as pd
import numpy as np
import re
#Чтение исходного файла с данными.
df = pd.read_excel(r’ПУТЬ К ФАЙЛУНазвание исходного файла с данными.xlsx’, dtype=’str’)
# Регулярные выражения.
# Шаблон (слова/сочетания слов, которые необходимо найти в столбцах).
r = r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)|(залог.*?транспорт)|(транспорт.*?залог)|(залог.*?авто)|(авто.*?залог)|(автострахов)’

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

#Для каждой строки ищем шаблон в столбце «Обращение».
obr = df[‘Обращение’].apply(lambda x: re.search(r, str(x).lower())) #другой вариант: obr = df[‘ Обращение ‘].str.lower().str.contains(r)
#Для каждой строки ищем шаблон в столбце «Решение».
otvet = df[‘Решение’].apply(lambda x: re.search(r, str(x).lower())) #другой вариант: otvet = df[‘Решение’].str.lower().str.contains(r)
#Для каждой строки проверяем наличие шаблона хотя бы в одном из столбцов «Обращение» и «Решение» (результат — True/False).
itog = np.any(np.array([~obr.isnull(), ~otvet.isnull()]), axis=0)
#Результат (оставляем только те строки в таблице, по которым получен результат True).
new_df = df[itog]
#Запись результата в excel.
new_df.to_excel(‘Название итогового файла.xlsx’, index=False)

В результате получаем новый файл excel, в который полностью скопированы нужные нам обращения клиентов:

— в обращении клиента с ИНН 1111111111 в столбцах «Обращение» и «Решение» содержится слово «КАСКО»;

— в обращении клиента с ИНН 333333333333 в столбце «Решение» содержатся сочетания слов «залог…транспорт», «транспорт…страх», «залог…авто», «страх…авто»;

— в обращении клиента с ИНН 444444444444 в столбце «Обращение» содержатся сочетания слов «страх…транспорт»; «транспорт…залог».

Количество столбцов, в которых можно производить поиск ключевых слов, не ограничен – в приведенном примере их два, но у вас может быть больше.

При необходимости для каждого столбца можно задать свой шаблон для поиска слов:

#Шаблон 1 для столбца «Обращение».
r1= r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)’
#Шаблон 2 для столбца «Решение».
r2= r'(залог.*?транспорт)|(транспорт.*?залог)|(залог.*?авто)|(авто.*?залог)|(автострахов)’
#Поиск шаблонов 1 и 2 в столбцах «Обращение» и «Решение» соответственно.
obr = df[‘Обращение’].apply(lambda x: re.search(r1, str(x).lower()))
otvet = df[‘Решение’].apply(lambda x: re.search(r2, str(x).lower()))

Если требуется выбрать строки, в которых ключевые слова содержатся и в том, и в другом столбце, то нужно заменить функцию any() на all():

itog = np.all(np.array([~obr.isnull(), ~otvet.isnull()]), axis=0)

Теперь рассмотрим ситуацию, когда у нас имеется несколько файлов excel с обращениями клиентов (с аналогичной структурой столбцов), и необходимо в каждом выбрать подходящие обращения.

Тогда код, с помощью которого мы отберем нужные строки, будет выглядеть так:

#Импорт библиотек.
import pandas as pd
import numpy as np
import os
import re
import warnings
#Игнорирование всех предупреждений.
warnings.filterwarnings(‘ignore’)
#Путь к папке с исходными файлами.
path = r’ПУТЬ К ПАПКЕ С ФАЙЛАМИ ‘
#Регулярные выражения.
#Шаблон (слова/сочетания слов, которые необходимо найти в столбцах).
r= r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)|(залог.*?транспорт)|(транспорт.*?залог)|(залог.*?авто)|(авто.*?залог)|(автострахов)’
#Создание папки, в которую будут сохраняться файлы с нужными обращениями.
os.makedirs(‘Нужные обращения’, exist_ok=True)
#Получение списка полных имён для всех файлов xlsx в папке с исходными файлами.
docs = []
for root, _, files in os.walk(path):
for file in files:
if file.split(‘.’)[-1] == ‘xlsx’:
docs.append(os.path.join(root, file))
print(f’В директории {path} nобнаружено {len(docs)} файлов’)
#Для каждого файла из списка производим его чтение, поиск шаблона в столбцах «Обращение» и «Решение», проверяем наличие шаблона хотя бы в одном из данных столбцов, оставляем только те строки в таблице, по которым получен результат True, записываем результат в excel в папку «Нужные обращения».
%%time
for i, doc in enumerate(docs):
df = pd.read_excel(doc)
print(f'{i+1} файл из {len(docs)} прочитан’, end=’ ‘)
obr = df[‘Обращение’].apply(lambda x: re.search(r, str(x).lower()))
otvet = df[‘Решение’].apply(lambda x: re.search(r, str(x).lower()))
itog = np.any(np.array([~obr.isnull(), ~otvet.isnull()]), axis=0)
df = df[itog]
df.to_excel(os.path.join(‘Нужные обращения’, doc.split(‘\’)[-1]), index=False)
print(‘и обработан’)

В результате создается папка «Нужные обращения», в которой содержатся новые файлы excel с полностью скопированными нужными обращениями клиентов. По количеству и названию данные файлы соответствуют исходным.

Таким образом, благодаря Python поиск строк в файлах по ключевым словам в столбцах становится быстрым и несложным делом. Приведенный код значительно ускоряет и упрощает работу аналитика в части фильтрации строк по большому количеству условий по нескольким столбцам.

Время на прочтение
5 мин

Количество просмотров 63K

Excel — это чрезвычайно распространённый инструмент для анализа данных. С ним легко научиться работать, есть он практически на каждом компьютере, а тот, кто его освоил, может с его помощью решать довольно сложные задачи. Python часто считают инструментом, возможности которого практически безграничны, но который освоить сложнее, чем Excel. Автор материала, перевод которого мы сегодня публикуем, хочет рассказать о решении с помощью Python трёх задач, которые обычно решают в Excel. Эта статья представляет собой нечто вроде введения в Python для тех, кто хорошо знает Excel.

Загрузка данных

Начнём с импорта Python-библиотеки pandas и с загрузки в датафреймы данных, которые хранятся на листах sales и states книги Excel. Такие же имена мы дадим и соответствующим датафреймам.

import pandas as pd
sales = pd.read_excel('https://github.com/datagy/mediumdata/raw/master/pythonexcel.xlsx', sheet_name = 'sales')
states = pd.read_excel('https://github.com/datagy/mediumdata/raw/master/pythonexcel.xlsx', sheet_name = 'states')

Теперь воспользуемся методом .head() датафрейма sales для того чтобы вывести элементы, находящиеся в начале датафрейма:

print(sales.head())

Сравним то, что будет выведено, с тем, что можно видеть в Excel.

Сравнение внешнего вида данных, выводимых в Excel, с внешним видом данных, выводимых из датафрейма pandas

Тут можно видеть, что результаты визуализации данных из датафрейма очень похожи на то, что можно видеть в Excel. Но тут имеются и некоторые очень важные различия:

  • Нумерация строк в Excel начинается с 1, а в pandas номер (индекс) первой строки равняется 0.
  • В Excel столбцы имеют буквенные обозначения, начинающиеся с буквы A, а в pandas названия столбцов соответствуют именам соответствующих переменных.

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

Реализация возможностей Excel-функции IF в Python

В Excel существует очень удобная функция IF, которая позволяет, например, записать что-либо в ячейку, основываясь на проверке того, что находится в другой ячейке. Предположим, нужно создать в Excel новый столбец, ячейки которого будут сообщать нам о том, превышают ли 500 значения, записанные в соответствующие ячейки столбца B. В Excel такому столбцу (в нашем случае это столбец E) можно назначить заголовок MoreThan500, записав соответствующий текст в ячейку E1. После этого, в ячейке E2, можно ввести следующее:

=IF([@Sales]>500, "Yes", "No")

Использование функции IF в Excel

Для того чтобы сделать то же самое с использованием pandas, можно воспользоваться списковым включением (list comprehension):

sales['MoreThan500'] = ['Yes' if x > 500 else 'No' for x in sales['Sales']]

Списковые включения в Python: если текущее значение больше 500 — в список попадает Yes, в противном случае — No

Списковые включения — это отличное средство для решения подобных задач, позволяющее упростить код за счёт уменьшения потребности в сложных конструкциях вида if/else. Ту же задачу можно решить и с помощью if/else, но предложенный подход экономит время и делает код немного чище. Подробности о списковых включениях можно найти здесь.

Реализация возможностей Excel-функции VLOOKUP в Python

В нашем наборе данных, на одном из листов Excel, есть названия городов, а на другом — названия штатов и провинций. Как узнать о том, где именно находится каждый город? Для этого подходит Excel-функция VLOOKUP, с помощью которой можно связать данные двух таблиц. Эта функция работает по принципу левого соединения, когда сохраняется каждая запись из набора данных, находящегося в левой части выражения. Применяя функцию VLOOKUP, мы предлагаем системе выполнить поиск определённого значения в заданном столбце указанного листа, а затем — вернуть значение, которое находится на заданное число столбцов правее найденного значения. Вот как это выглядит:

=VLOOKUP([@City],states,2,false)

Зададим на листе sales заголовок столбца F как State и воспользуемся функцией VLOOKUP для того чтобы заполнить ячейки этого столбца названиями штатов и провинций, в которых расположены города.

Использование функции VLOOKUP в Excel

В Python сделать то же самое можно, воспользовавшись методом merge из pandas. Он принимает два датафрейма и объединяет их. Для решения этой задачи нам понадобится следующий код:

sales = pd.merge(sales, states, how='left', on='City')

Разберём его:

  1. Первый аргумент метода merge — это исходный датафрейм.
  2. Второй аргумент — это датафрейм, в котором мы ищем значения.
  3. Аргумент how указывает на то, как именно мы хотим соединить данные.
  4. Аргумент on указывает на переменную, по которой нужно выполнить соединение (тут ещё можно использовать аргументы left_on и right_on, нужные в том случае, если интересующие нас данные в разных датафреймах названы по-разному).

Сводные таблицы

Сводные таблицы (Pivot Tables) — это одна из самых мощных возможностей Excel. Такие таблицы позволяют очень быстро извлекать ценные сведения из больших наборов данных. Создадим в Excel сводную таблицу, выводящую сведения о суммарных продажах по каждому городу.

Создание сводной таблицы в Excel

Как видите, для создания подобной таблицы достаточно перетащить поле City в раздел Rows, а поле Sales — в раздел Values. После этого Excel автоматически выведет суммарные продажи для каждого города.

Для того чтобы создать такую же сводную таблицу в pandas, нужно будет написать следующий код:

sales.pivot_table(index = 'City', values = 'Sales', aggfunc = 'sum')

Разберём его:

  1. Здесь мы используем метод sales.pivot_table, сообщая pandas о том, что мы хотим создать сводную таблицу, основанную на датафрейме sales.
  2. Аргумент index указывает на столбец, по которому мы хотим агрегировать данные.
  3. Аргумент values указывает на то, какие значения мы собираемся агрегировать.
  4. Аргумент aggfunc задаёт функцию, которую мы хотим использовать при обработке значений (тут ещё можно воспользоваться функциями mean, max, min и так далее).

Итоги

Из этого материала вы узнали о том, как импортировать Excel-данные в pandas, о том, как реализовать средствами Python и pandas возможности Excel-функций IF и VLOOKUP, а также о том, как воспроизвести средствами pandas функционал сводных таблиц Excel. Возможно, сейчас вы задаётесь вопросом о том, зачем вам пользоваться pandas, если то же самое можно сделать и в Excel. На этот вопрос нет однозначного ответа. Python позволяет создавать код, который поддаётся тонкой настройке и глубокому исследованию. Такой код можно использовать многократно. Средствами Python можно описывать очень сложные схемы анализа данных. А возможностей Excel, вероятно, достаточно лишь для менее масштабных исследований данных. Если вы до этого момента пользовались только Excel — рекомендую испытать Python и pandas, и узнать о том, что у вас из этого получится.

А какие инструменты вы используете для анализа данных?

Напоминаем, что у нас продолжается конкурс прогнозов, в котором можно выиграть новенький iPhone. Еще есть время ворваться в него, и сделать максимально точный прогноз по злободневным величинам.

UPDATE:

In [155]: text = 'Смеситель'

In [156]: df[df.ix[:,1].str.lower().str.contains(text.lower())]
Out[156]:
    № товара Наименование товара  Цена товара Страна производитель
5          6     Смеситель VITEK         5000               РОССИЯ
9         10     Смеситель Rivex        11000             СЛОВЕНИЯ
11        12  Смеситель Tragefar         7000               РОССИЯ

Вот решение, использующее Pandas модуль:

import pandas as pd

text = 'blender'

df = pd.read_excel(r'D:temp.dataexcel.xlsx')
df[df.ix[:,1].str.lower().str.contains(text.lower())].to_excel('d:/temp/result.xlsx', index=False)

PS для Python 2.x стоит воспользоваться unicode_literals или декодировать строку:

from __future__ import unicode_literals

или

df[df.ix[:,1].str.lower().str.contains(text.decode('utf-8').lower())]

Demo (Python 3.5):

In [133]: import pandas as pd

In [134]: text = 'blender'

In [135]: fn = r'D:temp.dataexcel.xlsx'

In [136]: df = pd.read_excel(fn)

In [137]: df
Out[137]:
    № товара          Наименование товара  Цена товара Страна производитель
0          1            Кондиционер VITEK        22000                КИТАЙ
1          2            Мультиварка Tefal         8000             СЛОВЕНИЯ
2          3                 Blender BEKO         4000               ЯПОНИЯ
3          4   Микроволновая печь Redmond         3800                КИТАЙ
4          5           Сплит-система BEKO        25000                КИТАЙ
5          6              Смеситель VITEK         5000               РОССИЯ
6          7              Blender Messimo         9000                  США
7          8          Мультиварка Redmond         3000               РОССИЯ
8          9  Микроволновая печь Smithson        19000                КИТАЙ
9         10              Смеситель Rivex        11000             СЛОВЕНИЯ
10        11             Blender SmithPRO        14000               ЯПОНИЯ
11        12           Смеситель Tragefar         7000               РОССИЯ

фильтруем по второй (в Python/Pandas нумерация начинается с 0, поэтому вторая колонка имеет индекс: 1) колонке

In [138]: df[df.ix[:,1].str.lower().str.contains(text.lower())]
Out[138]:
    № товара Наименование товара  Цена товара Страна производитель
2          3        Blender BEKO         4000               ЯПОНИЯ
6          7     Blender Messimo         9000                  США
10        11    Blender SmithPRO        14000               ЯПОНИЯ

In [139]: df[df.ix[:,1].str.lower().str.contains(text)].to_excel('d:/temp/result.xlsx', index=False)

result.xlsx:

введите сюда описание изображения

PS самый быстрый и простой способ установки Pandas — установить Anaconda, который уже включает в себя все необходимые модули для анализа и обработки данных: NumPy, SciPy, sklearn, Pandas и многое другое

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    In this article, we will learn how to import an excel file into a data frame and find the specific column. Let’s suppose our excel file looks like this.

    Sample_data.xlsx

    Excel sheet Link: https://drive.google.com/file/d/1x-S0z-gTo–H8byN12_MWLawlCXfMZkm/view?usp=sharing

    Approach :

    • Import Pandas program
    • Create a DataFrame
    • Store Excel data into DataFrame
    • Check the specific column and display with head() function

    Below is the implementation.

    Step 1: Import excel file.

    Python3

    import pandas as pd

    df = pd.read_excel('Sample_data.xlsx')  

    df.head()

    Output :

    Step 2: Check the specific column and display topmost 5 value with the head()

    Python3

    df[df["Country"] == 'Canada'].head()

    Output :

    Another column with the same methods.

    Python3

    df[df["Year"] == 2013].head()

    Output :

    Another column with the same methods.

    Python3

    df[df["Segment"]=='Government'].head()

    Output :

    Like Article

    Save Article

    Хотя многие Data Scientist’ы больше привыкли работать с CSV-файлами, на практике очень часто приходится сталкиваться с обычными Excel-таблицами. Поэтому сегодня мы расскажем, как читать Excel-файлы в Pandas, а также рассмотрим основные возможности Python-библиотеки OpenPyXL для чтения метаданных ячеек.

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

    Для чтения таблиц Excel в Pandas требуются дополнительные зависимости:

    • xlrd поддерживает старые и новые форматы MS Excel [1];
    • OpenPyXL поддерживает новые форматы MS Excel (.xlsx) [2];
    • ODFpy поддерживает свободные форматы OpenDocument (.odf, .ods и .odt) [3];
    • pyxlsb поддерживает бинарные MS Excel файлы (формат .xlsb) [4].

    Мы рекомендуем установить только OpenPyXL, поскольку он нам пригодится в дальнейшем. Для этого в командной строке прописывается следующая операция:

    pip install openpyxl

    Затем в Pandas нужно указать путь к Excel-файлу и одну из установленных зависимостей. Python-код выглядит следующим образом:

    import pandas as pd
    pd.read_excel(io='temp1.xlsx', engine='openpyxl')
    #
         Name  Age  Weight
    0    Alex   35      87
    1   Lesha   57      72
    2  Nastya   21      64

    Читаем несколько листов

    Excel-файл может содержать несколько листов. В Pandas, чтобы прочитать конкретный лист, в аргументе нужно указать sheet_name. Можно указать список названий листов, тогда Pandas вернет словарь (dict) с объектами DataFrame:

    dfs = pd.read_excel(io='temp1.xlsx',
                        engine='openpyxl',
                        sheet_name=['Sheet1', 'Sheet2'])
    dfs
    #
    {'Sheet1':      Name  Age  Weight
     0    Alex   35      87
     1   Lesha   57      72
     2  Nastya   21      64,
     'Sheet2':     Name  Age  Weight
     0  Gosha   43      95
     1   Anna   24      65
     2   Lena   22      78}

    Если таблицы в словаре имеют одинаковые атрибуты, то их можно объединить в один DataFrame. В Python это выглядит так:

    pd.concat(dfs).reset_index(drop=True)
         Name  Age  Weight
    0    Alex   35      87
    1   Lesha   57      72
    2  Nastya   21      64
    3   Gosha   43      95
    4    Anna   24      65
    5    Lena   22      78

    Указание диапазонов

    Таблицы могут размещаться не в самом начале, а как, например, на рисунке ниже. Как видим, таблица располагается в диапазоне A:F.

    Таблица Excel

    Таблица с диапазоном

    Чтобы прочитать такую таблицу, нужно указать диапазон в аргументе usecols. Также дополнительно можно добавить header — номер заголовка таблицы, а также nrows — количество строк, которые нужно прочитать. В аргументе header всегда передается номер строки на единицу меньше, чем в Excel-файле, поскольку в Python индексация начинается с 0 (на рисунке это номер 5, тогда указываем 4):

    pd.read_excel(io='temp1.xlsx',
                  engine='openpyxl',
                  usecols='D:F',
                  header=4, # в excel это №5
                  nrows=3)
    #
        Name  Age  Weight
    0  Gosha   43      95
    1   Anna   24      65
    2   Lena   22      78

    Читаем таблицы в OpenPyXL

    Pandas прочитывает только содержимое таблицы, но игнорирует метаданные: цвет заливки ячеек, примечания, стили таблицы и т.д. В таком случае пригодится библиотека OpenPyXL. Загрузка файлов осуществляется через функцию load_workbook, а к листам обращаться можно через квадратные скобки:

    from openpyxl import load_workbook
    wb = load_workbook('temp2.xlsx')
    ws = wb['Лист1']
    type(ws)
    # openpyxl.worksheet.worksheet.Worksheet

    Excel-таблица OpenPyXL

    Две таблицы на листе

    Допустим, имеется Excel-файл с несколькими таблицами на листе (см. рисунок выше). Если бы мы использовали Pandas, то он бы выдал следующий результат:

    pd.read_excel(io='temp2.xlsx',
                  engine='openpyxl')
    #
         Name  Age  Weight  Unnamed: 3 Name.1  Age.1  Weight.1
    0    Alex   35      87         NaN  Tanya     25        66
    1   Lesha   57      72         NaN  Gosha     43        77
    2  Nastya   21      64         NaN  Tolya     32        54

    Можно, конечно, заняться обработкой и привести таблицы в нормальный вид, а можно воспользоваться OpenPyXL, который хранит таблицу и его диапазон в словаре. Чтобы посмотреть этот словарь, нужно вызвать ws.tables.items. Вот так выглядит Python-код:

    ws.tables.items()
    wb = load_workbook('temp2.xlsx')
    ws = wb['Лист1']
    ws.tables.items()
    #
    [('Таблица1', 'A1:C4'), ('Таблица13', 'E1:G4')]

    Обращаясь к каждому диапазону, можно проходить по каждой строке или столбцу, а внутри них – по каждой ячейке. Например, следующий код на Python таблицы объединяет строки в список, где первая строка уходит на заголовок, а затем преобразует их в DataFrame:

    dfs = []
    for table_name, value in ws.tables.items():
        table = ws[value]
        header, *body = [[cell.value for cell in row]
                          for row in table]
        df = pd.DataFrame(body, columns=header)
        dfs.append(df)

    Если таблицы имеют одинаковые атрибуты, то их можно соединить в одну:

    pd.concat(dfs)
    #
         Name  Age  Weight
    0    Alex   35      87
    1   Lesha   57      72
    2  Nastya   21      64
    0   Tanya   25      66
    1   Gosha   43      77
    2   Tolya   32      54

    Сохраняем метаданные таблицы

    Как указано в коде выше, у ячейки OpenPyXL есть атрибут value, который хранит ее значение. Помимо value, можно получить тип ячейки (data_type), цвет заливки (fill), примечание (comment) и др.

    Excel OpenPyXL

    Таблица с цветными ячейками

    Например, требуется сохранить данные о цвете ячеек. Для этого мы каждую ячейку с числами перезапишем в виде <значение,RGB>, где RGB — значение цвета в формате RGB (red, green, blue). Python-код выглядит следующим образом:

    # _TYPES = {int:'n', float:'n', str:'s', bool:'b'}
    data = []
    for row in ws.rows:
        row_cells = []
        for cell in row:
            cell_value = cell.value
            if cell.data_type == 'n':
                cell_value = f"{cell_value},{cell.fill.fgColor.rgb}"
            row_cells.append(cell_value)
        data.append(row_cells)

    Первым элементом списка является строка-заголовок, а все остальное уже значения таблицы:

    pd.DataFrame(data[1:], columns=data[0])
    #
         Name          Age       Weight
    0    Alex  35,00000000  87,00000000
    1   Lesha  57,00000000  72,FFFF0000
    2  Nastya  21,FF00A933  64,00000000

    Теперь представим атрибуты в виде индексов с помощью метода stack, а после разобьём все записи на значение и цвет методом str.split:

    (pd.DataFrame(data[1:], columns=data[0])
     .set_index('Name')
     .stack()
     .str.split(',', expand=True)
    )
    #
                    0         1
    Name                       
    Alex   Age     35  00000000
           Weight  87  00000000
    Lesha  Age     57  00000000
           Weight  72  FFFF0000
    Nastya Age     21  FF00A933
           Weight  64  0000000

    Осталось только переименовать 0 и 1 на Value и Color, а также добавить атрибут Variable, который обозначит Вес и Возраст. Полный код на Python выглядит следующим образом:

    (pd.DataFrame(data[1:], columns=data[0])
     .set_index('Name')
     .stack()
     .str.split(',', expand=True)
     .set_axis(['Value', 'Color'], axis=1)
     .rename_axis(index=['Name', 'Variable'])
     .reset_index()
    )
    #
         Name Variable Value     Color
    0    Alex      Age    35  00000000
    1    Alex   Weight    87  00000000
    2   Lesha      Age    57  00000000
    3   Lesha   Weight    72  FFFF0000
    4  Nastya      Age    21  FF00A933
    5  Nastya   Weight    64  00000000

    Ещё больше подробностей о работе с таблицами в Pandas, а также их обработке на реальных примерах Data Science задач, вы узнаете на наших курсах по Python в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.

    Источники

    1. https://xlrd.readthedocs.io/en/latest/
    2. https://openpyxl.readthedocs.io/en/latest/
    3. https://github.com/eea/odfpy
    4. https://github.com/willtrnr/pyxlsb
    state_to_code = {"VERMONT": "VT", "GEORGIA": "GA", "IOWA": "IA", "Armed Forces Pacific": "AP", "GUAM": "GU",
                     "KANSAS": "KS", "FLORIDA": "FL", "AMERICAN SAMOA": "AS", "NORTH CAROLINA": "NC", "HAWAII": "HI",
                     "NEW YORK": "NY", "CALIFORNIA": "CA", "ALABAMA": "AL", "IDAHO": "ID", "FEDERATED STATES OF MICRONESIA": "FM",
                     "Armed Forces Americas": "AA", "DELAWARE": "DE", "ALASKA": "AK", "ILLINOIS": "IL",
                     "Armed Forces Africa": "AE", "SOUTH DAKOTA": "SD", "CONNECTICUT": "CT", "MONTANA": "MT", "MASSACHUSETTS": "MA",
                     "PUERTO RICO": "PR", "Armed Forces Canada": "AE", "NEW HAMPSHIRE": "NH", "MARYLAND": "MD", "NEW MEXICO": "NM",
                     "MISSISSIPPI": "MS", "TENNESSEE": "TN", "PALAU": "PW", "COLORADO": "CO", "Armed Forces Middle East": "AE",
                     "NEW JERSEY": "NJ", "UTAH": "UT", "MICHIGAN": "MI", "WEST VIRGINIA": "WV", "WASHINGTON": "WA",
                     "MINNESOTA": "MN", "OREGON": "OR", "VIRGINIA": "VA", "VIRGIN ISLANDS": "VI", "MARSHALL ISLANDS": "MH",
                     "WYOMING": "WY", "OHIO": "OH", "SOUTH CAROLINA": "SC", "INDIANA": "IN", "NEVADA": "NV", "LOUISIANA": "LA",
                     "NORTHERN MARIANA ISLANDS": "MP", "NEBRASKA": "NE", "ARIZONA": "AZ", "WISCONSIN": "WI", "NORTH DAKOTA": "ND",
                     "Armed Forces Europe": "AE", "PENNSYLVANIA": "PA", "OKLAHOMA": "OK", "KENTUCKY": "KY", "RHODE ISLAND": "RI",
                     "DISTRICT OF COLUMBIA": "DC", "ARKANSAS": "AR", "MISSOURI": "MO", "TEXAS": "TX", "MAINE": "ME"}
    

    Like this post? Please share to your friends:
  • Pandas pivot table to excel
  • Pandas import from excel
  • Pandas html to excel
  • Pandas from excel to csv
  • Pandas excel цвет ячейки