Морской участок pandas датафрейм по нескольким группам - PullRequest
1 голос
/ 20 января 2020

У меня есть pandas фрейм данных, где я вложил 4 категории (50,60,70,80) в две категории (положительная, отрицательная), и я хотел бы построить график с морским Kdeplot столбца (например, A_mean. ..) на основе группового. Чего я хочу добиться - это picture (это было сделано путем разбиения pandas на список). Я просмотрел несколько постов, этот код ( Несколько одиночных графиков в seaborn с pandas групповыми данными ) работает для одного уровня, но не для двух, если я хочу построить это для каждого Game_RS:

for i, group in df_hb_SLR.groupby('Condition'):
    sns.kdeplot(data=group['A_mean_per_subject'], shade=True, color='blue', label = 'label name')

Я пытался использовать этот ( Seaborn groupby pandas Series ), но первый ответ не сработал для меня:

sns.kdeplot(df_hb_SLR.A_mean_per_subject, groupby=df_hb_SLR.Game_RS)

AttributeError: 'Line2D' object has no property 'groupby'

и сводный ответ, которым я был не в состоянии сделать работу. Есть ли прямой путь из морского побережья или какой-либо другой способ напрямую из pandas Dataframe?

Мои данные доступны в формате csv по этой ссылке - data , и я загружаю их как обычно:

df_hb_SLR = pd.read_csv('data.csv')

Спасибо за помощь.

1 Ответ

1 голос
/ 21 января 2020

Вот решение с использованием Seaborn's FacetGrid, которое делает такие вещи действительно легкими

g = sns.FacetGrid(data=df_hb_SLR, col="Condition", hue='Game_RS', height=5, aspect=0.5)
g = g.map(sns.kdeplot, 'A_mean_per_subject', shade=True)
g.add_legend()

enter image description here

Недостаток FacetGrid заключается в том, что он создает новую фигуру, поэтому если вы хотите интегрировать эти графики в больший ансамбль вспомогательных сюжетов, вы можете достичь того же результата, используя groupby() и некоторые циклы:

group1 = "Condition"
N1 = len(df_hb_SLR[group1].unique())
group2 = 'Game_RS'
target = 'A_mean_per_subject'
height = 5
aspect = 0.5
colour = ['gray', 'blue', 'green', 'darkorange']


fig, axs = plt.subplots(1,N1, figsize=(N1*height*aspect,N1*height*aspect), sharey=True)

for (group1Name,df1),ax in zip(df_hb_SLR.groupby(group1),axs):
    ax.set_title(group1Name)
    for (group2Name,df2),c in zip(df1.groupby(group2), colour): 
        sns.kdeplot(df2[target], shade=True, label=group2Name, ax=ax, color = c) 

enter image description here

...