Реализация Plotly на pandas датафрейме из преобразования pyspark - PullRequest
1 голос
/ 20 января 2020

Я бы хотел построить сюжетные графики с использованием pandas данных. Я бьюсь над этим топи c.

Теперь у меня есть это:

           AGE_GROUP                       shop_id         count_of_member
0                 10                             1                      40
1                 10                            12                   57615
2                 20                             1                     186
4                 30                             1                     175
5                 30                            12                  322458
6                 40                             1                     171
7                 40                            12                  313758
8                 50                             1                     158
10                60                             1                     168

В некоторых магазинах может не быть записи. В качестве примера, плотно понадобится x=[1,2,3], y=[4,5,6]. Если я введу x=[1,2,3] и y=[4,5], тогда x и y не будут иметь одинаковый размер, и будет сгенерировано исключение. Мне нужно добавить запись с нулевым значением для отсутствующего shop_id. Итак, мне нужно это:

           AGE_GROUP                       shop_id         count_of_member
0                 10                             1                      40
1                 10                            12                   57615
2                 20                             1                     186
3                 20                            12                       0
4                 30                             1                     175
5                 30                            12                  322458
6                 40                             1                     171
7                 40                            12                  313758
8                 50                             1                     158
9                 50                            12                       0
10                60                             1                     168
11                60                            12                       0

Для каждой возрастной группы мне нужно иметь 2 shop_id, поскольку уникальный набор shop_id равен 1 и 12, если существует 10 age_group, будет показано 20 строк. Например:

           AGE_GROUP                       shop_id         count_of_member
1                 10                            12                   57615
2                 20                             1                     186
3                 30                             1                     175
4                 40                             1                     171
5                 40                            12                  313758
6                 50                             1                     158
7                 60                             1                     168

есть 2 уникальных shop_id: 1 и 12 и 6 различных возрастных групп: 10,20,30,40,50,60 в возрастной группе 10: существует только shop_id 12, но нет shop_id 1 Итак, мне нужна новая запись, показывающая, что count_of_member для age_group 10 из shop_id 1 равен 0. Последний кадр данных, который я получу, должен быть:

           AGE_GROUP                       shop_id         count_of_member
1                 10                            12                   57615
**1                 10                             1                       0**
2                 20                             1                     186
**2                 20                            12                       0**
3                 30                             1                     175
**3                 30                            12                       0**
4                 40                             1                     171
5                 40                            12                  313758
6                 50                             1                     158
**6                 50                            12                       0**
7                 60                            12                       0
7                 60                             1                     168

** are the new added rows

Как я могу реализовать это преобразование?

1 Ответ

0 голосов
/ 20 января 2020

Как я могу реализовать это преобразование?

Прежде всего, вам не нужно . При правильном использовании plotly предлагает широкий спектр подходов, в которых вы можете визуализировать свой набор данных в том виде, в каком вы видите его данные в третьем примере:

           AGE_GROUP                       shop_id         count_of_member
1                 10                            12                   57615
2                 20                             1                     186
3                 30                             1                     175
4                 40                             1                     171
5                 40                            12                  313758
6                 50                             1                     158
7                 60                             1                     168

Нет необходимости применять pandas к добраться до структуры четвертого образца. Вам не ясно, что вы хотели бы сделать с этим образцом, но я подозреваю, что вы хотели бы показать накопленное count_of_member за age group, разделенное на shop_id, как это?

enter image description here

Вы можете удивиться, почему синие полосы для shop_id1 не отображаются. Но это только потому, что размер чисел так сильно отличается. Если вы замените miniscule count_of_member на shop_id=1 на что-то более сопоставимое с shop_id=12, вы получите вместо этого:

enter image description here

Ниже приведен полный фрагмент кода, в котором измененный набор данных закомментирован. Используемый набор данных остается таким же, как в третьем образце данных.

Полный код:

# imports
import plotly.graph_objects as go
import pandas as pd

data = {'AGE_GROUP': {0: 10, 1: 10, 2: 20, 4: 30, 5: 30, 6: 40, 7: 40, 8: 50, 10: 60},
                     'shop_id': {0: 1, 1: 12, 2: 1, 4: 1, 5: 12, 6: 1, 7: 12, 8: 1, 10: 1},
                     'count_of_member': {0: 40,
                      1: 57615,
                      2: 186,
                      4: 175,
                      5: 322458,
                      6: 171,
                      7: 313758,
                      8: 158,
                      10: 168}}

## Optional dataset
# data = {'AGE_GROUP': {0: 10, 1: 10, 2: 20, 4: 30, 5: 30, 6: 40, 7: 40, 8: 50, 10: 60},
#                      'shop_id': {0: 1, 1: 12, 2: 1, 4: 1, 5: 12, 6: 1, 7: 12, 8: 1, 10: 1},
#                      'count_of_member': {0: 40,
#                       1: 57615,
#                       2: 186000,
#                       4: 175000,
#                       5: 322458,
#                       6: 171000,
#                       7: 313758,
#                       8: 158000,
#                       10: 168000}}

# # Create DataFrame 
df = pd.DataFrame(data)

# Manage shop_id
shops = df['shop_id'].unique()

# set up plotly figure
fig = go.Figure()

# add one trace per NAR type and show counts per hospital
for shop in shops:

    # subset dataframe by shop_id
    df_ply=df[df['shop_id']==shop]

    # add trace
    fig.add_trace(go.Bar(x=df_ply['AGE_GROUP'], y=df_ply['count_of_member'], name='shop_id'+str(shop)))

fig.show()

РЕДАКТИРОВАТЬ:

Если вам по какой-то причине по-прежнему необходимо структурировать данные, как в четвертом примере, я предлагаю вам задать еще один вопрос и специально пометить его только с [pandas] и [python] и сосредоточиться исключительно на части вопроса о преобразовании данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...