Я пытаюсь построить линейную диаграмму большого набора данных, в котором я хочу установить для значения «count» значение y.
Это макет DF:
my = pd.DataFrame(np.array(
[['Apple', 1],
['Kiwi', 2],
['Clementine', 3],
['Kiwi', 1],
['Banana', 2],
['Clementine', 3],
['Apple', 1],
['Kiwi', 2]]),
columns=['fruit', 'cheers'])
Я хотел бы, чтобы сюжет использовал «ура» в качестве х, а затем по одной строке для каждого «фрукта» и количество раз «ура»
РЕДАКТИРОВАТЬ: Линейный график не может быть лучшим занятием, пожалуйста, сообщите мне тогда. Я хотел бы что-то вроде этого:
В большом наборе данных может быть один, а не несколько «нулей», возможно, мне следовало бы сделать еще больший дф.
Всего 4 ответа
Приведенный ниже код построит линию для каждого «фрукта», где координата x
- это количество «ура», а координата y
- количество «ура» на фрукт.
Во-первых, датафрейм сгруппирован по фруктам, чтобы получить список приветствий по фруктам. Затем гистограмма рассчитывается и строится для каждого списка приветствий. Значение max_cheers_count используется для обеспечения одинаковых координат x для всех построенных линий.
Примечание: см. Ответ @ Heike ниже для более питонного решения.
import matplotlib.pyplot as plt
import numpy as np
# convert 'cheers' column to int
my.cheers = my['cheers'].astype(int)
# computes maximal cheers value, to use later for the histogram
max_cheers_count = my['cheers'].max()
# get cheer counts per fruit
cheer_counts = my.groupby('fruit').apply(lambda x: x['cheers'].values)
# for each fruit compute histogram of cheer counts and plot it
plt.figure()
for row in cheer_counts.iteritems():
histogram = np.histogram(a=row[1], bins=range(1,max_cheers_count+2))
plt.plot(histogram[1][:-1], histogram[0], marker='o', label=row[0])
plt.xlabel('cheers')
plt.ylabel('counts')
plt.legend()
Я вижу, вы уже приняли ответ, но альтернативный способ сделать это что-то вроде
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
my = pd.DataFrame(np.array([['Apple', 1],
['Kiwi', 2],
['Clementine', 3],
['Kiwi', 1],
['Banana', 2],
['Clementine', 3],
['Apple', 1],
['Kiwi', 2]]),
columns=['fruit', 'cheers'])
my_pivot = my.pivot_table(index = 'cheers',
columns = 'fruit',
fill_value = 0,
aggfunc={'fruit':len})['fruit']
my_pivot.plot.line()
plt.tight_layout()
plt.show()
Выход:
my.groupby('fruit').sum().plot.barh()
Обратите внимание, что ваш примерный фрейм данных имеет числа, представленные в виде string
типа, поэтому вы можете изменить его на int
раньше, используя
my.cheers = my.cheers.astype(int)
Это из-за вашей инициализации фрейма данных через 2D-массив.
Вы можете избежать этого, используя словарный подход для создания фрейма данных:
my = pd.DataFrame(
{'fruit': ['Apple', 'Kiwi', 'Clementine', 'Kiwi', 'Banana', 'Clementine', 'Apple', 'Kiwi'],
'cheers': [1, 2, 3, 1, 2, 3, 1, 2]})
Альтернативный способ получить именно ту цифру, которую вы разместили и которая начинает кривые с 0, заключается в следующем. Идея состоит в том, чтобы посчитать частоту встречаемости каждого фрукта для разных аплодисментов, а затем использовать словари.
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# Define the dataframe here
# my = pd.DataFrame(...)
cheers = np.array(my['cheers'])
for fr in np.unique(my['fruit']):
freqs = Counter(cheers[np.argwhere(my['fruit']==fr)].flatten()) # Count the frequency
init_dict = {Ɔ': 0}
init_dict.update({i: 0 for i in np.unique(cheers)}) # Initialize the dictionary with 0 values
for k, v in freqs.items():
init_dict[k] = v # Update the values of cheers
plt.plot(init_dict.keys(), init_dict.values(), '-o', label=fr) # Plot each fruit line
plt.legend()
plt.yticks(range(4))
plt.show()