Рубрики
Без рубрики

Изменение панды данных DataFrames.

Лето находится всего за углом, и все, кажется, спрашивают то же самое … Помечено с пандами, Python, анализа данных.

Лето всего за углом, и все, кажется, задают тот же вопрос: «Мои данные выглядят … вне формы?» Независимо от того, ли вы ученый или инженер, Data-Image Dysmorphia может привести к серьезным негативным мыслям, которые оставляют вас вторым догадыванием наших данных.

Многое уже говорилось о модификации DataFrames на «Micro» уровня, таком как операции по столбцам. Но как насчет модификации целых данных сразу? При рассмотрении роли Numpy в общей математике, она не должна прийти не удивленно, что Pandas DataFrames обладает большим количеством сходства с матрицами, которые мы выучили в средней школе Pre-Calc; А именно, они любят меняться все сразу. Легко видеть это в действии при нанесении основных математических функций для нескольких данных подобных данных, таких как DF1 + DF2 , DF1/DF2 , так далее.

Помимо оружия математического уничтожения, есть много способов действовать на целые таблицы данных. Мы могли бы сделать это по ряду причин, таких как приготовление данных для визуализации данных, или выявить секреты, скрытые внутри. Это звучит сложнее, чем на практике. Изменение данных таким образом удивительно легко, и большая часть терминологии, которую мы охватим, будет знакомым к типичной электронной таблице. Задача знает Когда Чтобы использовать эти операции, и многие из этих наручных работ покрываются просто зная, что они существуют. Мне посчастливилось узнать этот урок из моей жизни наставника: Г.И. Джо.

Знание составляет примерно 50% битвы.

Я буду продемонстрировать эти операции в действии, используя Результаты опроса разработчиков Stackoverflow’s 2018 Отказ Я уже сделал некоторые первоначальные манипулирования данными, чтобы спасти вас от скучных материалов. Вот заглянуть на данные:

0 0 0 35 – 44 года 0 0 0 0 0 0 0 0 0 1 51000.0 Соединенное Королевство 1 Занятый полный рабочий день 1 да 3 0 0 30 или более лет Работая в другой или более специализированной технической роли, чем то, что я сейчас Фунт стерлингов Django
1 1 0 18 – 24 года 1 0 1 1 0 0 0 0 0 0 260000.0 Южная Африка 1 Занятый полный рабочий день 0 Нет 7 0 0 6-8 лет Работая в другой или более специализированной технической роли, чем то, что я сейчас Зар
0 0 0 18 – 24 года 0 0 0 1 0 0 0 0 0 1 30000.0 Соединенное Королевство 0 Занятый полный рабочий день 1 Нет 8 1 0 6-8 лет Работая в другой или более специализированной технической роли, чем то, что я сейчас Фунт стерлингов Угловой; node.js.
0 0 0 18 – 24 года 0 0 0 0 0 0 0 0 0 0 120000.0 Соединенные Штаты 0 Занятый полный рабочий день 1 да 9 0 0 9-11 лет Работает основателем или соучредителем моей собственной компании доллар США Node.js; реагировать
0 0 1 35 – 44 года 0 0 1 0 1 0 0 0 1 1 250000.0 Соединенные Штаты 1 Занятый полный рабочий день 1 да 11 0 0 30 или более лет Делать то же самое доллар США Hadoop; Node.js; реагировать; искра
0 0 0 18 – 24 года 0 1 0 1 0 0 0 0 0 0 0.0 Нидерланды 0 Занятый полный рабочий день 1 Нет 21 0 0 0-2 года Работа в карьере, совершенно не связанной с разработкой программного обеспечения евро
0 0 0 35 – 44 года 0 0 1 0 0 0 0 0 0 0 32000.0 Швеция 1 Занятый полный рабочий день 0 Нет 27 0 0 6-8 лет Работая в другой или более специализированной технической роли, чем то, что я сейчас Север .СЕТЬ Основной
1 0 1 35 – 44 года 1 0 1 0 0 0 0 1 0 1 120000.0 Австралия 0 Занятый полный рабочий день 0 да 33 0 0 15-17 лет Работая в другой или более специализированной технической роли, чем то, что я сейчас Aud. Угловой; node.js.
0 0 0 25 – 34 года 0 1 1 0 0 0 0 0 0 0 25.0 Соединенное Королевство 0 Занятый полный рабочий день 1 Нет 37 0 0 9-11 лет Работа в качестве менеджера по продукту или менеджером проекта Фунт стерлингов .СЕТЬ Основной
0 0 0 45 – 54 лет 0 1 1 0 0 0 0 0 0 0 75000.0 Соединенные Штаты 1 Занятый полный рабочий день 1 Нет 38 0 0 18-20 лет Работа в карьере, совершенно не связанной с разработкой программного обеспечения доллар США


Int64Index: 49236 entries, 1 to 89965
Data columns (total 27 columns):
Respondent 49236 non-null int64
Country 49236 non-null object
OpenSource 49236 non-null object
Employment 49066 non-null object
HopeFiveYears 48248 non-null object
YearsCoding 49220 non-null object
CurrencySymbol 48795 non-null object
Salary 48990 non-null float64
FrameworkWorkedWith 34461 non-null object
Age 47277 non-null object
Bash/Shell 49236 non-null uint8
C 49236 non-null uint8
C++ 49236 non-null uint8
Erlang 49236 non-null uint8
Go 49236 non-null uint8
Java 49236 non-null uint8
JavaScript 49236 non-null uint8
...
dtypes: float64(1), int64(1), object(8), uint8(17)
memory usage: 6.2+ MB

Группа К

Вы, вероятно, уже знакомы с скромным Groupby () Метод, который позволяет нам выполнять агрегатные функции на наши данные. Groupby () имеет решающее значение для получения высокого уровня понимания наших данных или извлекать значимые выводы.

Давайте проверим, как наши данные распространяются. Давайте посмотрим на общий возрастной ассортимент людей, которые заняли интервью штакоты. Я собираюсь уменьшить наше dataframe в два столбца первым:

groupedDF = stackoverflowDF.filter(items=['Country',
                                          'Age']) # Remove columns
groupedDF = groupedDF.groupby(['Age']).count() # Perform Aggregate
print(groupedDF)

Мы используем count () Укажите агрегатный тип. В этом случае count () даст нам количество раз, когда каждое значение происходит в нашем наборе данных:

                    Country
Age
18 - 24 years old 9840
25 - 34 years old 25117
35 - 44 years old 8847
45 - 54 years old 2340
55 - 64 years old 593
65 years or older 73
Under 18 years old 467

Круто, похоже на нас много всего 25 лет! Винт этих молодых парней.

Почему наши ценности хранятся под столбцом округа (что именно делает Страна Знакомства)? Когда мы агрегируем считать Негругнутые столбцы имеют свои значения заменены на счет нашего группового столбца … что довольно запутанно. Если бы мы оставили все столбцы перед выполнением Groupby () , все Колонны содержали бы эти же значения. Это не очень полезно.

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

groupedDF = stackoverflowDF.filter(items=['Salary',
                                  'Age',
                                  'CurrencySymbol']) # Remove columns
groupedDF = groupedDF.loc[groupedDF['CurrencySymbol'] == 'USD']
groupedDF = groupedDF.groupby(['Age']).median() # Get median salary by age 
groupedDF.sort_values(by=['Salary'],
                      inplace=True,
                      ascending=False) # Sort descending
print(groupedDF)

                      Salary
Age
45 - 54 years old 120000.0
55 - 64 years old 120000.0
35 - 44 years old 110000.0
65 years or older 99000.0
25 - 34 years old 83000.0
18 - 24 years old 50000.0
Under 18 years old 0.0

Таять

Я не уверен, если вы замечаете ранее, но наш набор данных немного странный. Существует столбец для каждого языка программирования в существовании, что делает наш стол исключительно долго. Кто бы сделал такую вещь? (Я сделал, для демонстрационных целей TBH). Свиток вбок ниже для взгляда (извините средних читателей):

0 0 0 35 – 44 года 0 0 0 0 0 0 0 0 0 1 51000.0 Соединенное Королевство 1 Занятый полный рабочий день 1 да 3 0 0 30 или более лет Работая в другой или более специализированной технической роли, чем то, что я сейчас Фунт стерлингов Django
1 1 0 18 – 24 года 1 0 1 1 0 0 0 0 0 0 260000.0 Южная Африка 1 Занятый полный рабочий день 0 Нет 7 0 0 6-8 лет Работая в другой или более специализированной технической роли, чем то, что я сейчас Зар
0 0 0 18 – 24 года 0 0 0 1 0 0 0 0 0 1 30000.0 Соединенное Королевство 0 Занятый полный рабочий день 1 Нет 8 1 0 6-8 лет Работая в другой или более специализированной технической роли, чем то, что я сейчас Фунт стерлингов Угловой; node.js.
0 0 0 18 – 24 года 0 0 0 0 0 0 0 0 0 0 120000.0 Соединенные Штаты 0 Занятый полный рабочий день 1 да 9 0 0 9-11 лет Работает основателем или соучредителем моей собственной компании доллар США Node.js; реагировать
0 0 1 35 – 44 года 0 0 1 0 1 0 0 0 1 1 250000.0 Соединенные Штаты 1 Занятый полный рабочий день 1 да 11 0 0 30 или более лет Делать то же самое доллар США Hadoop; Node.js; реагировать; искра

Это много ерунды! Хороший способ обрабатывать данные разделить, как это, используя Pandas ‘ расплавить () Отказ Короче говоря, расплавить () принимает значения на нескольких столбцах и конденсирует их в один столбец. В процессе каждый ряд нашего dataframe будет дублирован несколько раз, равных количеству столбцов, которые мы «плавление». Это легче общаться с этим визуально:

Визуальное представление расплава пандас.

В приведенном выше примере мы используем расплавить () В размере выборки 3 строк (желтые) и 3 колонны (JavaScript, Python, R). Каждое расплавленное имя столбца перемещается под новым столбцом под названием Язык Отказ Для каждой колонны мы расплавите, дублируются существующая строка для приспособления заправки данных в один столбец, и наше dataframe вырастает дольше. Мы таем 3 столбцы в примере выше, поэтому каждые исходные строки будут дублировать 3 раза (новые строки, отображаемые синим цветом). Наша выборка из 3 рядов превращается в 9 Total, и наши 3 растопленные колонны уходят. Давайте увидимся в действии:

meltDF = pd.melt(stackoverflowDF,
                 id_vars=['Respondent',
                          'Country',
                          'OpenSource',
                          'Employment',
                          'HopeFiveYears',
                          'YearsCoding',
                          'CurrencySymbol',
                          'Salary'],
                  value_vars=['JavaScript',
                              'Python',
                              'Go',
                              'Java',
                              'Objective-C',
                              'Swift',
                              'R',
                              'Ruby',
                              'Rust',
                              'SQL',
                              'Scala',
                              'PHP'],
                  var_name='Language')

id_vars Являются ли столбцы, которые мы поддерживаем то же самое, что будет талым. value_vars Являемся ли столбец, которые мы хотели бы расплавить. Наконец, мы называем наш новый столбец консолидированных ценностей с var_name Отказ Вот что .Информация () Похоже, после того, как мы запустим это:


RangeIndex: 590832 entries, 0 to 590831
Data columns (total 10 columns):
Respondent 590832 non-null int64

Country 590832 non-null object
OpenSource 590832 non-null object
Employment 588792 non-null object
HopeFiveYears 578976 non-null object
YearsCoding 590640 non-null object
CurrencySymbol 585540 non-null object
Salary 587880 non-null float64
Language 590832 non-null object
value 590832 non-null int64
dtypes: float64(1), int64(2), object(7)
memory usage: 45.1+ MB

Визуальный эффект этого заключается в том, что широкие источники данных становятся очень, очень долго (наше использование памяти прошло от 6,2 МБ до 45,1 МБ!). Почему это полезно? Для одного, что происходит, если Новый Язык программирования изобретен? Если это часто бывает, это, вероятно, лучше не иметь этих разделений на столбцы. Что еще более важно, этот формат необходим для задач, таких как данные Chartning (например, мы видели в Учебное пособие по Meeborbor ) или создавая поворотные таблицы.

Бонус: Elt + groupby.

С нашими данными расплавлена, это легче извлечь информацию, используя Groupby () Отказ Давайте выясним наиболее распространенные языки программирования! Для этого я возьму наше dataframe и сделаю следующие настройки:

  • Удалите дополнительные столбцы.
  • Ряды падения, где значение языка равно 0.
  • Выполнить сумма () совокупность
meltDF.drop(columns=['Respondent', 'Salary'], inplace=True)
meltDF = meltDF.loc[meltDF['value'] == 1]
meltDF = meltDF.groupby(['Language']).sum()
meltDF.sort_values(by=['value'],
                   inplace=True,
                   ascending=False)
print(meltDF.head(10))

Language
JavaScript 35736
SQL 29382
Java 21451
Python 19182
PHP 14644
Ruby 5512
Swift 4037
Go 3817
Objective-C 3536
R 3036

Сводные столы

Сводные столы позволяют нам просмотреть агрегаты по двум размерам. В агрегации мы выступали выше, мы обнаружили общую популярность языков программирования (1-мерное совокупность). Для того, как выглядит 2-мерный агрегат, мы расширимся на этом примере, чтобы разделить наш язык программирования итогов на второе измерение: популярность по возрасту группе.

Визуализация шарнира

Слева находится наше расплавленное значение DataFrame, уменьшается до трех столбцов: возраст, язык и значение (я также показал столбец ID респондента для справки). Когда мы создаем сводную таблицу, мы возьмем значения в одном из этих двух столбцов и объявляем тех, кто является столбцами в нашей новой таблице (обратите внимание, как значения в возраст слева становятся столбцами справа). Когда мы делаем это, Язык Столбец становится тем, какие Pandas вызывает «ID» Pivot (идентификатор по строке).

Наша таблица Pivot содержит только одно появление значений, которые мы используем в нашем расплавленном файле DataFrame ( JavaScript выглядит много раз слева, но один раз справа). Каждый раз, когда мы создаем сводную таблицу, мы объединяем значения в двух столбцах и расщепляем их два померка. Разница между Сводная таблица и а регулярные повороты Это то, что поворотные таблицы всегда выполняют совокупную функцию, тогда как простые пивоты нет.

Наша пивота теперь показывает популярность языка по возрасту . Это может дать нам некоторые интересные идеи, такие как Java более популярны у детей в возрасте до 25 лет, чем Python (кто-то должен ставить эти дети прямо).

Вот как мы делаем это в пандах:

pivotTableDF = stackoverflowDF.filter(items=['Age',
                                             'Language',
                                             'value'])
pivotTableDF = pd.pivot_table(stackoverflowDF,
                              index='Language',
                              columns='Age',
                              values='value',
                              aggfunc=np.sum,
                              margins=True)
pivotTableDF.sort_values(by=['All'],
                         inplace=True,
                         ascending=False)
print(pivotTableDF)

pd.pivot_table () Это то, что нам нужно для создания таблицы пивота (обратите внимание, как это функция Pandas, а не метод DataFrame). Первое, что мы проходим, это DataFrame, который мы хотели бы пивовать. Тогда аргументы ключевых слов:

  • индекс : Определяет столбец для использования в качестве меток строки для нашей таблицы пивота.
  • Колонны : Оригинальный столбец, который содержит значения, которые составляют новые столбцы в нашей таблице Pivot.
  • ценности : Данные, которые будут заполнить поперечное сечение наших рядов индекса против столбцов.
  • aggfunc Тип агрегации для выполнения значений, которые мы покажем. Считать даст нам количество вхождений, Среднее примет среднее, и Медиана было бы… Ну, вы получаете это (для моего собственного любопытства, я использовал Median, чтобы создать некоторую информацию о распределении зарплаты … попробую его).
  • Маржинс : Создает колонку итогов (названа «все»).

Транспонировать

Сейчас это история все о том, как моя жизнь сломалась, перевернулась с ног на голову. Это то, что вы бы говорили, если бы вы случили, чтобы вы были датафарамом, которое только что транспонировалось.

Транспонирование DataFrame просто переворачивает столик на его стороне, так что ряды становятся колоннами и наоборот. Вот ужасная идея: давайте попробуем это на наших необработанных данных!

stackoverflowDF = stackoverflowDF.filter(items=['Respondent',
                                                'Country',
                                                'OpenSource',
                                                'Employment',
                                                'HopeFiveYears',
                                                'YearsCoding',
                                                'CurrencySymbol',
                                                'Salary',
                                                'Age'])
stackoverflowDF = stackoverflowDF.transpose()

Транспонирование DataFrame так же просто, как df.transone () Отказ Результат это именно то, что мы ожидали:

3 7 8 9 11 Респондент
Соединенное Королевство Южная Африка Соединенное Королевство Соединенные Штаты Соединенные Штаты Страна
да Нет Нет да да Открытый исходный код
Занятый полный рабочий день Занятый полный рабочий день Занятый полный рабочий день Занятый полный рабочий день Занятый полный рабочий день Работа
Работая в другой или более специализированной технической роли, чем то, что я сейчас Работая в другой или более специализированной технической роли, чем то, что я сейчас Работая в другой или более специализированной технической роли, чем то, что я сейчас Работает основателем или соучредителем моей собственной компании Делать то же самое Надеждаfiveyears.
30 или более лет 6-8 лет 6-8 лет 9-11 лет 30 или более лет Годыкодирование
Фунт стерлингов Зар Фунт стерлингов доллар США доллар США Символ валюты
51000.0 260000.0 30000.0 120000.0 250000.0 Зарплата
35 – 44 года 18 – 24 года 18 – 24 года 18 – 24 года 35 – 44 года Возраст

Конечно, это всего лишь первые 5 столбцов. Фактическая форма нашего dataframe сейчас [9 рядов х 49236 столбцов] Отказ По общему признанию, это был не лучший пример.

Стек и усесть

Вы когда-нибудь столкнулись с мобильно-надежной отзывчивой таблицей в Интернете? При просмотре табличных данных на мобильном устройстве некоторые сайты представляют данные в компактном «сложенном» формате, который хорошо вписывается на экраны с ограниченным горизонтальным пространством. Это лучший способ описать, что стек () делает, но посмотреть для себя:

stackoverflowDF = stackoverflowDF.stack()
print(stackoverflowDF)

0 Respondent 3
   Country United Kingdom
   OpenSource Yes
   Employment Employed full-time
   HopeFiveYears Working in a different or more specialized tec...
   YearsCoding 30 or more years
   CurrencySymbol GBP

   Salary 51000
   Age 35 - 44 years old
1 Respondent 7
   Country South Africa
   OpenSource No
   Employment Employed full-time
   HopeFiveYears Working in a different or more specialized tec...
   YearsCoding 6-8 years
   CurrencySymbol ZAR
   Salary 260000
   Age 18 - 24 years old
2 Respondent 8
   Country United Kingdom
   OpenSource No
   Employment Employed full-time
   HopeFiveYears Working in a different or more specialized tec...
   YearsCoding 6-8 years
   CurrencySymbol GBP
   Salary 30000
   Age 18 - 24 years old
3 Respondent 9
   Country United States
   OpenSource Yes
   Employment Employed full-time
   HopeFiveYears Working as a founder or co-founder of my own c...
   YearsCoding 9-11 years
   CurrencySymbol USD
   Salary 120000
   Age 18 - 24 years old
...

Наши данные теперь «укладываются» в соответствии с нашим индексом. Посмотри, что я имею в виду? Укладка Поддерживает несколько индексов Кроме того, что можно пропустить с помощью Уровень Параметр ключевых слов.

Чтобы отменить стек, просто используйте df.unstack () Отказ

Во всяком случае, я уверен, что вы хотите ударить на пляж и показывать ваши измельченные данные. Я позволю тебе добраться до этого. Ты заслужил это.

Оригинал: “https://dev.to/hackersandslackers/reshaping-pandas-dataframes-5a3a”