#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 уникальных значений в столбце «имя_варианта», и поэтому в идеале было бы создавать отдельные графики, поскольку скомпилированная версия действительно загромождена. Есть ли способ перебирать уникальное строковое значение и создавать по одному графику для каждого? Еще раз спасибо вам!!