Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер
Всем привет, меня зовут Питер~
В этой статье представлены 4 метода преобразования строк и столбцов в Pandas, в том числе:
- melt
- Транспонировать T или транспонировать
- wide_to_long
- взорвать (функция взрыва)
Наконец, ответьте на вопрос об обработке данных, заданный другом-читателем.
Преобразование строки в столбец Pandas
В pandas есть несколько способов реализовать преобразование строки в столбец:
библиотека импорта
import pandas as pd
import numpy as np
функция расплава
Основные параметры расплава:
pandas.melt(frame,
id_vars=None,
value_vars=None,
var_name=None,
value_name='value',
ignore_index=True,
col_level=None)
Значение параметров поясняется ниже:
-
кадр: кадр данных DataFrame для обработки.
-
id_vars: указываетне нужно конвертироватьимя столбца
-
value_vars: указываетнужно преобразовать, если нужно преобразовать все оставшиеся столбцы, можно не писать
-
var_name и value_name: настройте имя столбца в соответствии с настройкой, что эквивалентно получению нового имени столбца.
-
igonore_index: игнорировать ли исходное имя столбца, по умолчанию установлено значение True, то есть игнорировать исходное имя индекса и перегенерировать естественный индекс 0, 1, 2, 3, 4....
-
col_level: если столбец является столбцом многоуровневого индекса MultiIndex, используйте этот параметр; этот параметр используется редко.
Данные моделирования
# 待转换的数据:frame
df = pd.DataFrame({"col1":[1,1,1,1,1],
"col2":[3,3,3,3,3],
"col3":["a","a","a","b","b"]
})
df
id_vars
value_vars
Используйте два вышеуказанных параметра одновременно:
Преобразование нескольких свойств столбца одновременно:
имя_переменной и имя_значения
pd.melt(
df,
id_vars=["col1"], # 不变
value_vars=["col3"], # 转变
var_name="col4", # 新的列名
value_name="col5" # 对应值的新列名
)
ignore_index
По умолчанию создаются естественные индексы:
Можно изменить на False, чтобы использовать исходный индекс:
Функция транспонирования
Атрибут T или функция транспонирования в pandas заключается в реализации функции строки в столбец, если быть точным, транспонировании
простое транспонирование
Смоделируйте часть данных и посмотрите результат транспонирования:
Транспонировать с помощью функции транспонирования:
Есть и другой способ: сначала транспонировать значения, а затем поменять местами индекс и имена столбцов:
Наконец, посмотрите на простой случай:
функция wide_to_long
Буквально: преобразовать набор данных из широкого формата в длинный формат.
wide_to_long(
df,
stubnames,
i,
j,
sep: str = "",
suffix: str = "\\d+"
Конкретное объяснение параметров:
- df: фрейм данных, который нужно преобразовать
- stubnames: часть хранилища с тем же именем столбца в широкой таблице
- i: столбец для использования в качестве переменной идентификатора
- j: установить столбцы для столбцов «суффикс» длинного формата
- sep: установите разделитель для удаления. Например, если столбцы имеют значение A-2020, укажите sep='-', чтобы удалить разделитель. По умолчанию пусто.
- суффикс: получить «суффикс», установив регулярное выражение. По умолчанию '\d+' означает получение суффикса числа. "Суффикс" без цифр можно получить с помощью '\D+'
Данные моделирования
процесс преобразования
Используйте функции для реализации преобразований:
Настроить многоуровневый индекс
Сначала смоделируйте данные:
Если вы не привыкли к многоуровневым индексам, вы можете конвертировать в следующий формат:
sep и суффикс
df5 = pd.DataFrame({
'a': [1, 1, 2, 2, 3, 3, 3],
'b': [1, 2, 2, 3, 1, 2, 3],
'stu_one': [2.8, 2.9, 1.8, 1.9, 2.2, 2.3, 2.1],
'stu_two': [3.4, 3.8, 2.8, 2.4, 3.3, 3.4, 2.9]
})
df5
pd.wide_to_long(
df5,
stubnames='stu',
i=['a', 'b'],
j='number',
sep='_', # 列名中存在连接符时使用;默认为空
suffix=r'\w+') # 基于正则表达式的后缀;默认是数字\d+;这里改成\w+,表示字母
Функция взрыва -explode
explode(column, ignore_index=False)
Эта функция имеет всего два параметра:
- столбец: элемент, который нужно разнести
- ignore_index: игнорировать ли индекс; по умолчанию False, сохранить исходный индекс
Данные моделирования
взрыв одиночного поля
Выполните процесс разнесения на одном поле, превратив широкую таблицу в длинную:
Параметры ignore_index
Взрыв нескольких полей
Процесс последовательного взрыва нескольких полей:
Читатели сомневаются
Чтобы ответить на вопрос читателя, данные представлены в форме моделирования. Требуются следующие данные:
Доля каждого фрукта в каждом магазине в каждом магазине
fruit = pd.DataFrame({
"shop":["shop1","shop3","shop2","shop3",
"shop2","shop1","shop3","shop2",
"shop3","shop2","shop3","shop2","shop1"],
"fruit":["苹果","葡萄","香蕉","苹果",
"葡萄","橘子","梨","哈密瓜",
"葡萄","香蕉","苹果","葡萄","橘子"],
"number":[100,200,340,150,
200,300,90,80,340,
150,200,300,90]})
fruit
Прежде всего, нам нужно посчитать продажи каждого фрукта в каждом магазине.
Метод 1: Многоэтапный
Метод 1 использует многоэтапное решение:
1. Общий объем продаж каждого магазина
2. Увеличьте сумму столбца shop_sum
3. Коэффициент генерации