предисловие
В последнее время Pandas часто используется для очистки и обработки некоторых данных, из-за моей неопытности с Pandas некоторые процедуры обработки сложны и не нужны.
Я также часто не могу вспомнить некоторые случаи использования панданов некоторое время и постоянно проверяю документацию.
Поэтому вот простая запись процесса обработки, которую я обычно использую.
Здесь нет знакомства с пандами. Он будет постоянно обновляться. Это просто личный рекорд. Если вам это не нравится, не распыляйте его ~
Использовать среду
jupyter notebook
Импорт необходимых пакетов
import pandas as pd
import numpy as np
построить данные 1
# 构建数据 学生信息
data = {'编号': ['01', '02', '03', '04'],
'姓名': ['小明', '小红', '小兰', '小张'],
'数学': [80, 90, 60, 90],
'语文': [70, 80, 90, 70]}
df = pd.DataFrame(data)
1. Изменить значение столбца в целом
# 现在要求所有学生语文上调 10 分
df_ = df.copy()
df_['语文'] = df_['语文'] + 10
df_
2. Измените значение столбца, удовлетворяющего условию
# 将 语文90分以上的 减10分
df_ = df.copy()
df_.loc[df_['语文']>=90, '语文'] = df_['语文']-10
df_
3. Добавьте новый столбец
# 新增每个学生的平均分
df_ = df.copy()
df_['平均分'] = df_[['数学', '语文']].mean(axis=1)
df_
# 根据其他列的值,给新列赋值,如 分数在60-70是及格...90-100是优秀
def score_level(x):
if x < 60:
return '不及格'
elif x < 70:
return '及格'
elif x < 80:
return '中等'
elif x < 90:
return '良好'
elif x <= 100:
return '优秀'
else:
raise Exception(f'“{x}”该分数有误')
df_ = df.copy()
df_['数学等级'] = df_['数学'].apply(score_level)
df_['语文等级'] = df_['语文'].apply(score_level)
df_
Примечание. Здесь вам может показаться, что за «Математикой» следует «Уровень математики», затем просто отрегулируйте следующий порядок, есть два способа достижения
# 第一种
df_ = df_.reindex(columns = ['编号', '姓名', '数学', '数学等级', '语文', '语文等级'])
# 第二种
# df_ = df_[['编号', '姓名', '数学', '数学等级', '语文', '语文等级']]
df_
4. Добавьте новую строку
# 新增每科的平均分
df_ = df.copy()
df_.loc['平均分'] = df[['数学', '语文']].mean()
df_
5. Столбец в строку
df_col = df.set_index(['编号', '姓名'])\
.stack()\
.reset_index()\
.rename({'level_2': '科目', 0: '分数'}, axis=1)
df_col
Объяснение используемых функций:
1. set_index(): установить «число», «имя» в качестве индекса;
2. stack(): установите индекс столбца в качестве вторичного индекса серии (используйте «номер» и «имя» в качестве первичного (комбинированного) индекса) и установите значение столбца в качестве значения;
3. reset_index(): сбросить индекс, тип данных DataFrame, еще два столбца level_2 и 0;
4. rename(): изменить имя индекса столбца.
6, строка в столбец
df_row = df_col.set_index(['编号', '姓名', '科目'])['分数']\
.unstack()\
.rename_axis(columns=None)\
.reset_index()
Объяснение используемых функций:
1. set_index(): установить «номер», «имя», «тема» в качестве индекса;
2. Затем извлеките «счет», тип данных Series;
3. unstack(): установите последний индекс индекса серии в качестве индекса столбца, значение столбца в качестве значения, тип данных DataFrame;
4. rename_axis(columns=None) устанавливает имя индекса столбца в None;
5. reset_index() сбрасывает индекс, изменяя индекс строки на индекс столбца.
Иллюстрация использования стека и распаковки
Примечание:
1) Не все серии могут использовать unstack, а DataFrame может использовать stack, unstack, необходимо видеть «комбинацию значений».
Например, если для одного и того же индекса в Series есть повторяющиеся значения, будет сообщено об ошибке unstack:
ValueError: Индекс содержит повторяющиеся записи, не может быть изменен.
2) unstack() также может передавать номер или имя уровня индекса, чтобы разделить другой уровень.
7, повернуть строку в столбец
pivot(): преобразование столбца в несколько столбцов в новом кадре данных.
Метод DataFrame.pivot(index=None, columns=None, values=None) эквивалентен использованию set_index() для создания иерархического индекса с последующим вызовом unstack().
- index: имя индекса измененной новой таблицы;
- столбцы: каково имя столбца измененной новой таблицы;
- values: какой столбец использовать для заполнения новой таблицы.
Я думал, что это делается с помощью одной строки кода, но был выполнен следующий код и было сообщено об ошибке:
df_col.pivot(['编号', '姓名'], '科目', '分数')
ValueError: Length of passed values is 8, index implies 2.
Примечание. Если есть способ решить эту проблему с помощью одной строки поворота, оставьте сообщение ~ Спасибо ~
7.1. Реализовать преобразование строки в столбец однострочного индекса
df_col.pivot('姓名', '科目', '分数')
7.2, реализовать преобразование строки в столбец многострочного индекса
df_col.pivot_table(index=['编号', '姓名'], columns='科目', values='分数')
Примечание. Конечно, pivot_table также может реализовать преобразование строки в столбец, указав один столбец.
8. Перенос колонки расплава
Обратная операция pivot() — это Melt(): объединить несколько столбцов в один, создав новую таблицу.
- id_vars: необязательный, имена столбцов, которые не нужно преобразовывать и использовать в качестве индексов строк после преобразования;
- value_vars: необязательный, существующие столбцы, которые необходимо преобразовать, если не указано, преобразуются все остальные столбцы, кроме id_vars;
- var_name: переменная значения по умолчанию, пользовательское имя столбца;
- value_name: значение по умолчанию, пользовательское имя столбца;
- col_level: необязательный, если столбец является MultiIndex, используется этот уровень.
df.melt(['编号', '姓名'], var_name='科目', value_name='分数')
Таким образом, преобразование строки в столбец по-прежнему удобно с функциями pivot() и Melt()!