Какая функция Панд мне нужна? group_by или pivot - PullRequest
0 голосов
/ 10 июля 2019

Я все еще относительно новичок в Pandas и не могу сказать, какую из функций мне лучше всего использовать, чтобы получить ответ. Я посмотрел на pivot, pivot_table, group_by и aggregate, но я не могу заставить его делать то, что мне нужно. Вполне возможно, ошибка пользователя, за что я прошу прощения!

У меня есть такие данные:

Original Data

Код для создания df:

import pandas as pd
df = pd.DataFrame([
    ['1', '1', 'A', 3, 7],
    ['1', '1', 'B', 2, 9],
    ['1', '1', 'C', 2, 9],
    ['1', '2', 'A', 4, 10],
    ['1', '2', 'B', 4, 0],
    ['1', '2', 'C', 9, 8],
    ['2', '1', 'A', 3, 8],
    ['2', '1', 'B', 10, 4],
    ['2', '1', 'C', 0, 1],
    ['2', '2', 'A', 1, 6],
    ['2', '2', 'B', 10, 2],
    ['2', '2', 'C', 10, 3]
], columns = ['Field1', 'Field2', 'Type', 'Price1', 'Price2'])
print(df)

Я пытаюсь получить такие данные:

Pivoted Data

Хотя моей конечной целью будет создание одного столбца для A, одного для B и одного для C. Поскольку A будет использовать Price1, а B & C будет использовать Price2.

Я не хочу обязательно получать максимальную, минимальную, среднюю или сумму цены, поскольку теоретически (хотя и маловероятно) могут быть две разные цены1 для одинаковых полей и типов.

Какую функцию лучше всего использовать в Pandas, чтобы получить то, что мне нужно?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Используйте DataFrame.set_index с DataFrame.unstack для изменения формы - в столбцах выводится MultiIndex, поэтому добавлен второй уровень сортировки по DataFrame.sort_index,Выровнять значения и последний созданный столбец из уровней Field:

df1 = (df.set_index(['Field1','Field2', 'Type'])
         .unstack(fill_value=0)
         .sort_index(axis=1, level=1))
df1.columns = [f'{b}-{a}' for a, b in df1.columns]
df1 = df1.reset_index()
print (df1)
  Field1 Field2  A-Price1  A-Price2  B-Price1  B-Price2  C-Price1  C-Price2
0      1      1         3         7         2         9         2         9
1      1      2         4        10         4         0         9         8
2      2      1         3         8        10         4         0         1
3      2      2         1         6        10         2        10         3

Возможно также решение с DataFrame.pivot_table, но оно объединяет значения в дубликатах первых 3 столбцов со значением по умолчанию meanфункция:

df2 = (df.pivot_table(index=['Field1','Field2'],
                      columns='Type',
                      values=['Price1', 'Price2'],
                      aggfunc='mean')
         .sort_index(axis=1, level=1))
df2.columns = [f'{b}-{a}' for a, b in df2.columns]
df2 = df2.reset_index()
print (df2)
1 голос
/ 10 июля 2019

использование pivot_table

pd.pivot_table(df, values =['Price1', 'Price2'], index=['Field1','Field2'],columns='Type').reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...