перебирайте уникальную строку в одном столбце и создавайте словарь или массив данных из 2 других столбцов, связанных с уникальной строкой

#python #pandas #matplotlib #data-wrangling

#python #панды #matplotlib #перебор данных

Вопрос:

У меня есть много файлов csv с одинаковой структурой данных следующим образом:

y x имя_варианта
82 12 F ^ W #Bfr18
76 3 F ^ W #Bfr18
45 18 * BCDS%q3rn
59 14 * BCDS%q3rn

Я пытаюсь перебрать каждый файл и использовать groupby функцию для variant_name столбца, собрать соответствующие данные в столбцах x и y и сгенерировать точечную диаграмму (оси x и y, как имена столбцов в этом примере).

group = df.groupby('variant_name')

Я думал, что мог бы использовать лямбда-функцию для хранения всех значений x и y, которые связаны с конкретным variant_name значением, но я полностью застрял. Я надеюсь, что это имеет смысл. Пожалуйста, дайте мне знать, если мне нужно уточнить. Спасибо!

Комментарии:

1. Вы просите точечный график для каждого variant_name ? В противном случае я не понимаю, что вы подразумеваете под столбцами в диаграмме рассеяния

Ответ №1:

Вы можете .groupby и получить среднее, и plot с scatter :

 df = df.groupby('variant_name', as_index=False).mean()
df.plot(kind='scatter', x='x', y='y')
 

введите описание изображения здесь

ИЛИ вы можете передать a hue в a sns.scatterplot без groupby :

 import seaborn as sns
sns.scatterplot(data=df, x='x', y='y', hue='variant_name')
 

введите описание изображения здесь

Комментарии:

1. Спасибо тебе, @Дэвид Эриксон! Это действительно работает, и я пытаюсь перебирать каждое уникальное имя, чтобы генерировать графики для каждого (у меня есть ~ 40 уникальных строк в этом столбце «variant_name»!). Ты знаешь, как я могу это сделать? Я думаю, что я бы составил список каждой уникальной строки в этом столбце, а затем перебрал каждую из них, чтобы отобразить значения, которые были сохранены из предыдущего фрагмента. Это правильно? Если да, то мне может понадобиться дополнительная помощь в этом.

Ответ №2:

С помощью следующего кода:

 df.groupby('variant_name').agg({'x': list, 'y':list})
 

вы получаете:

                    x         y
variant                       
*BCDS%q3rn  [45, 59]  [18, 14]
F^W#Bfr18   [82, 76]   [12, 3]
 

Затем вы можете перебирать различные варианты и отображать их:

 import pylab as plt
fig, ax = plt.subplots(1, 1)
for t in df.groupby('variant').agg({'x': list, 'y':list}).itertuples():
    ax.scatter(t.x, t.y, label=t.Index)
ax.legend()
plt.show()
 

введите описание изображения здесь

Редактировать

Если вам нужен график для каждого варианта, вы можете переместить создание фигуры в теле for:

 alpha = 1
for t in df.groupby('variant_name').agg({'x': list, 'y':list}).itertuples():
    fig, ax = plt.subplots(1, 1, num=t.Index)
    plt.suptitle(t.Index)
    ax.scatter(t.x, t.y, label=t.Index, alpha=alpha)
 

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

С другой стороны, если вы переходите к более сложным графикам, я предлагаю вам отделить код графика от остальной части вашего кода:

 def _plot_variant(variant_data, alpha=1):
    fig_title = variant_data.variant_name
    fig, ax = plt.subplots(1, 1, num=fig_title)
    plt.suptitle(fig_title)
    ax.scatter(variant_data.x, variant_data.y, alpha=alpha)

df.groupby('variant_name', as_index=False).agg({'x': list, 'y':list}).apply(_plot_variant, axis=1)
plt.show()
 

Комментарии:

1. Спасибо!! Это сработало потрясающе. У меня есть одна проблема, с которой я не стал вдаваться в подробности, но у меня около 40 уникальных значений в столбце «имя_варианта», и поэтому в идеале было бы создавать отдельные графики, поскольку скомпилированная версия действительно загромождена. Есть ли способ перебирать уникальное строковое значение и создавать по одному графику для каждого? Еще раз спасибо вам!!

Ответ №3:

Вероятно, Seaborn — это правильный путь. Довольно просто разделить варианты на их собственную диаграмму. FacetGrid имеет множество опций для управления количеством строк и столбцов и т.д.

 import seaborn as sns
g = sns.FacetGrid(df, col='variant_name')
g.map_dataframe(sns.scatterplot, x='x', y='y')
 

введите описание изображения здесь