У меня есть набор данных, которые я читаю из нескольких файлов Excel. Я могу легко читать, объединять и группировать данные с пандами. У меня есть два столбца, представляющих интерес для данных: «Тип продукта» и «Продолжительность теста».

Фрейм данных, содержащий данные, считанные из файла Excel, называется oData.

oDataGroupedByProductType = oData.groupby(['Product Type'])

Я использовал график, чтобы построить график следующим образом, но график не держит данные закрытыми, и если я хочу, чтобы данные были конфиденциальными, я должен заплатить. Оплата не вариант. введите описание изображения здесь Как я могу сделать тот же график с пандами и / или matplotlib, но также со средним значением для каждого типа отображаемого продукта?

2
steve 9 Янв 2017 в 22:45

3 ответа

Лучший ответ

Как говорит Bound, вы можете сделать это в несколько строк с помощью stripplot (пример страницы документации по морскому рожению).

import seaborn as sns
sns.set_style("whitegrid")
tips = sns.load_dataset("tips") # load some sample data
ax = sns.stripplot(x="day", y="total_bill", data=tips)

enter image description here

1
Community 23 Май 2017 в 11:46

В случае, если кто-то еще имеет очень похожую проблему и хочет увидеть конечные результаты, я использовал seaborn следующим образом:

import seaborn as sns
import matplotlib.pyplot as plt
...
sns.set_style("whitegrid")
sns.boxplot(x=oData['Product Type'],
          y=oData['Test Duration?'],
          data=oData)
plt.savefig('Test Duration vs. Product Type.png')

График получился следующим образом. Из соображений конфиденциальности я размыл ярлыки продуктов на графике.

enter image description here

0
Connor 9 Янв 2017 в 21:10

Предположим, у вас есть какой-то фрейм данных:

In [4]: df.head(20)
Out[4]:
   product      value
0        c   5.155740
1        c   8.983128
2        c   5.150390
3        a   8.379866
4        c   8.094536
5        c   7.464706
6        b   3.690430
7        a   5.547448
8        a   7.709569
9        c   8.398026
10       a   7.317957
11       b   7.821332
12       b   8.815495
13       c   6.646533
14       c   8.239603
15       c   7.585408
16       a   7.946760
17       c   5.276864
18       c   8.793054
19       b  11.573413

Вам нужно иметь числовое значение для продукта, чтобы построить его, так что быстро и аккуратно, просто создайте новый столбец, сопоставив числовые значения:

In [5]: product_map = {p:r for p,r in zip(df['product'].unique(), range(1, df.values.shape[0]+1))}

In [6]: product_map
Out[6]: {'a': 2, 'b': 3, 'c': 1}

Конечно, есть много способов достичь этого ...

Теперь создайте новый столбец:

In [8]: df['product_code'] = df['product'].map(product_map)

In [9]: df.head(20)
Out[9]:
   product      value  product_code
0        c   5.155740             1
1        c   8.983128             1
2        c   5.150390             1
3        a   8.379866             2
4        c   8.094536             1
5        c   7.464706             1
6        b   3.690430             3
7        a   5.547448             2
8        a   7.709569             2
9        c   8.398026             1
10       a   7.317957             2
11       b   7.821332             3
12       b   8.815495             3
13       c   6.646533             1
14       c   8.239603             1
15       c   7.585408             1
16       a   7.946760             2
17       c   5.276864             1
18       c   8.793054             1
19       b  11.573413             3

Теперь используйте вспомогательный метод plot в pandas, который по сути является оберткой вокруг matplotlib:

In [10]: df.plot(kind='scatter', x = 'product_code', y = 'value')
Out[10]: <matplotlib.axes._subplots.AxesSubplot at 0x12235abe0>

И вывод:

enter image description here

Понятно, что это было быстро и грязно, но это должно помочь вам ...

0
juanpa.arrivillaga 9 Янв 2017 в 20:28