#python #matplotlib #seaborn
#python #matplotlib #сиборн
Вопрос:
У меня есть следующая конкретная структура данных:
df = pd.DataFrame(columns=["Feature1", "Target"],
data=[["A", 0],
["A", 0],
["A", 0],
["A", 1],
["A", 1],
["A", 1],
["B", 1],
["B", 1],
["B", 0],
["B", 0],
["B", 0]])
Как мне построить столбчатую диаграмму с процентным накоплением, которая выглядит примерно так, как показано ниже, чтобы я мог показать пропорции 0 и 1 в двух группах A и B?
Примечание: пропорции в dataframe df
отличаются от пропорций, показанных на рисунке.
Ответ №1:
Вы могли бы сначала посчитать значения каждого типа, затем разделить на общее количество для каждой функции и умножить на 100.
Результирующий фрейм данных может быть построен следующим образом:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
sns.set()
df = pd.DataFrame(columns=["Feature1", "Target"],
data=[["A", 0], ["A", 0], ["A", 0], ["A", 1], ["A", 1], ["A", 1],
["B", 1], ["B", 1], ["B", 0], ["B", 0], ["B", 0]])
df1 = (df.groupby(["Feature1", "Target"]).size() / df.groupby(["Feature1"]).size() * 100)
df1 = df1.reset_index(name='Percentage')
features = np.unique(df1['Feature1'])
plt.bar(x=features, height=100, color='dodgerblue', label='Target = 1')
plt.bar(x=features,
height=[df1[(df1['Feature1'] == x) amp; (df1['Target'] == 0)]['Percentage'].values[0] for x in features],
color='crimson', label='Target = 0')
plt.legend()
plt.xlabel('Feature1')
plt.ylabel('Percentage')
plt.show()