Biorąc pod uwagę dataframe (jest generowany z CSV, który zawiera nazwy i zamówienia i zaktualizowane codziennie):

# Note that this is just an example df and the real can have N names in n shuffled orders
df = pd.read_csv('names_and_orders.csv', header=0)
print(df)
    names    order
0   mike     0
1   jo       1
2   mary     2
3   jo       0
4   mike     1 
5   mary     2
6   mike     0 
7   mary     1
8   jo       2

Włączam to na ułożoną działkę barową za pomocą funkcji paska Pandasa i a Pętla, jak pokazano poniżej.

# Create list of names from original df
names1 = df['names'].drop_duplicates().tolist()
N = len(names1)
viridis = cm.get_cmap('viridis', 100)

# Get count of each name at each order
df_count = df_o.groupby(['order', 'names']).size().reset_index(name='count')

# Plot count vs order in a stacked bar with the label as the current name
for i in range(len(names1)):
    values = list(df_count[df_count['names'] == names1[i]].loc[:, 'count'])
    df_count[df_count['names'] == names1[i]].plot.bar(x='order', y='count', color=viridis(i / N), stacked=True,
                                                      bottom=values, edgecolor='black', label=names1[i])
    values += values
# Add ticks, labels, title, and legend to plot
plt.xticks(np.arange(0, N, step=1))
plt.xlabel('Order')
plt.yticks(np.arange(0, df_count['count'].max(), step=1))
plt.ylabel('Count')
plt.title('How many times each person has been at each order number')
plt.legend()
plt.show()

Biorąc pod uwagę ten kod, istnieją dwie główne problemy, które mam:

  1. Obecnie spisuje każde imię na innej postaci, zamiast wykonać jedną ułożoną działkę
  2. Nie wierzę, że values użycie dla bottom kwarg jest poprawny
1
DrakeMurdoch 20 listopad 2020, 22:12

1 odpowiedź

Najlepsza odpowiedź

Myślę, że to przemyślisz. Just unstack Groupby i fabuła:

df_count = df.groupby(['order', 'names']).size().unstack('names')
df_count.plot.bar(stacked=True)

Wynik:

enter image description here

2
Quang Hoang 20 listopad 2020, 19:16