Лето всего за углом, и все, кажется, задают тот же вопрос: «Мои данные выглядят … вне формы?» Независимо от того, ли вы ученый или инженер, 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”