Создание гистограммы для представления количества вхождений в серии Pandas - PullRequest
0 голосов
/ 25 ноября 2018

Мне было интересно, может ли кто-нибудь помочь мне с тем, как сделать гистограмму, показывающую частоты значений в серии Панд.

Я начну с формы данных Pandas DataFrame (2000, 7) иоттуда я извлекаю последний столбец.Столбец имеет форму (2000,).

Записи в Серии, которые я упомянул, варьируются от 0 до 17, каждая с разными частотами, и я попытался построить их с помощью гистограммы, но столкнулся с некоторыми трудностями.Вот мой код:

# First, I counted the number of occurrences.

count = np.zeros(max(data_val))

for i in range(count.shape[0]):
    for j in range(data_val.shape[0]):
        if (i == data_val[j]):
            count[i] = count[i] + 1

'''
This gives us
count = array([192., 105., ... 19.])
'''

temp = np.arange(0, 18, 1) # Array for the x-axis.

plt.bar(temp, count)

В последней строке кода я получаю сообщение о том, что the objects cannot be broadcast to a single shape.

В конечном итоге мне нужна столбчатая диаграмма, где каждый столбец соответствуетцелочисленное значение от 0 до 17, а высота каждого столбца (то есть ось y) представляет частоты.

Спасибо.


ОБНОВЛЕНИЕ

Я решил опубликовать фиксированный код, используя предположения, что людилюбезно дать ниже, на тот случай, если кто-нибудь, столкнувшийся с подобными проблемами, сможет увидеть мой исправленный код в будущем.

data = pd.read_csv("./data/train.csv") # Original data is a (2000, 7) DataFrame
# data contains 6 feature columns and 1 target column.

# Separate the design matrix from the target labels.
X = data.iloc[:, :-1]
y = data['target']


'''
The next line of code uses pandas.Series.value_counts() on y in order to count
the number of occurrences for each label, and then proceeds to sort these according to
index (i.e. label).

You can also use pandas.DataFrame.sort_values() instead if you're interested in sorting
according to the number of frequencies rather than labels.
'''
y.value_counts().sort_index().plot.bar(x='Target Value', y='Number of Occurrences')

enter image description here

Тамне было необходимости использовать циклы for, если мы используем методы, встроенные в библиотеку Pandas.

Конкретные методы, которые были упомянуты в ответах: pandas.Series.values_count(), pandas.DataFrame.sort_index() и pandas.DataFrame.plot.bar().

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вот подход, использующий Seaborn

import numpy as np
import pandas as pd
import seaborn as sns

s = pd.Series(np.random.choice(17, 10))
s
# 0    10
# 1    13
# 2    12
# 3     0
# 4     0
# 5     5
# 6    13
# 7     9
# 8    11
# 9     0
# dtype: int64

val, cnt = np.unique(s, return_counts=True)
val, cnt
# (array([ 0,  5,  9, 10, 11, 12, 13]), array([3, 1, 1, 1, 1, 1, 2]))

sns.barplot(val, cnt)

Seaborn plot

0 голосов
/ 25 ноября 2018

Я считаю, что вам нужно value_counts с Series.plot.bar:

df = pd.DataFrame({
         'a':[4,5,4,5,5,4],
         'b':[7,8,9,4,2,3],
         'c':[1,3,5,7,1,0],
         'd':[1,1,6,1,6,5],
})

print (df)
   a  b  c  d
0  4  7  1  1
1  5  8  3  1
2  4  9  5  6
3  5  4  7  1
4  5  2  1  6
5  4  3  0  5


df['d'].value_counts(sort=False).plot.bar()

pic

Если возможно, какое-то значение отсутствует и необходимо установить его на 0 добавить reindex:

df['d'].value_counts(sort=False).reindex(np.arange(18), fill_value=0).plot.bar()

g

Деталь :

print (df['d'].value_counts(sort=False))
1    3
5    1
6    2
Name: d, dtype: int64

print (df['d'].value_counts(sort=False).reindex(np.arange(18), fill_value=0))
0     0
1     3
2     0
3     0
4     0
5     1
6     2
7     0
8     0
9     0
10    0
11    0
12    0
13    0
14    0
15    0
16    0
17    0
Name: d, dtype: int64
...