Советы по использованию Pandas (DataFrame)

анализ данных

предисловие

В последнее время 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()!