Изменение формы кадра данных Pandas с повторяющимися значениями - PullRequest
1 голос
/ 18 июня 2020

Используя функцию Plotly go.Table() и Pandas, я пытаюсь создать таблицу для обобщения некоторых данных. Мои данные следующие:

import pandas as pd

test_df = pd.DataFrame({'Manufacturer':['BMW', 'Chrysler', 'Chrysler', 'Chrysler', 'Brokertec', 'DWAS', 'Ford', 'Buick'],
                          'Metric':['Indicator', 'Indicator', 'Indicator', 'Indicator', 'Indicator', 'Indicator', 'Indicator', 'Indicator'],
                          'Dimension':['Short', 'Short', 'Short', 'Long', 'Short', 'Short', 'Long', 'Long'],
                          'User': ['USA', 'USA', 'USA', 'USA', 'USA', 'New USA', 'USA', 'Los USA'],
                          'Value':[50, 3, 3, 2, 5, 7, 10, 5]
                   })

Мой желаемый результат выглядит следующим образом (суммируя Dimension на Manufacturer):

Manufacturer        Short        Long
Chrysler            6            2
Buick               5            5
Mercedes            7            0
Ford                0            10

Мне нужно сформировать Pandas кадра данных немного (и здесь у меня проблемы). Мой код был следующим:

table_columns = ['Manufacturer', 'Longs', 'Shorts']

manufacturers = ['Chrysler', 'Buick', 'Mercedes', 'Ford']

df_new = (df[df['Manufacturer'].isin(manufacturers)]
                        .set_index(['Manufacturer', 'Dimension'])
                        ['Value'].unstack()
                        .reset_index()[table_columns]
                        )

Затем создайте таблицу с помощью функции Plotly go.Table():

import plotly.graph_objects as go

direction_table = go.Figure(go.Table(
                                header=dict(
                                    values=table_columns,
                                    font=dict(size=12),
                                    line_color='darkslategray',
                                    fill_color='lightskyblue',
                                    align='center'
                                    ),
                                cells=dict(
                                    values=df_new.T,   # using Transpose here
                                    line_color='darkslategray',
                                    fill_color='lightcyan',
                                    align = 'center')
                                )
                )

direction_table

Я вижу ошибку:

ValueError: Index contains duplicate entries, cannot reshape

Как лучше всего решить эту проблему?

Заранее спасибо!

1 Ответ

2 голосов
/ 18 июня 2020

Вам нужно использовать pivot_table с aggfunc = 'sum' вместо set_index.unstack

table_columns = ['Manufacturer', 'Long', 'Short']

manufacturers = ['Chrysler', 'Buick', 'Mercedes', 'Ford']

df_new = (test_df[test_df['Manufacturer'].isin(manufacturers)]
               .pivot_table(index='Manufacturer', columns='Dimension', 
                            values='Value', aggfunc='sum', fill_value=0)
               .reset_index()
               .rename_axis(columns=None)[table_columns]
        )
print (df_new)
  Manufacturer  Long  Short
0        Buick     5      0
1     Chrysler     2      6
2         Ford    10      0

Обратите внимание, что это не тот же результат, но я не думаю, что ваш ввод может дать ожидаемый результат

Или тот же результат с groupby.sum и unstack

(test_df[test_df['Manufacturer'].isin(manufacturers)]
        .groupby(['Manufacturer', 'Dimension'])
        ['Value'].sum()
        .unstack(fill_value=0)
        .reset_index()
        .rename_axis(columns=None)[table_columns]
)
...