Использование pandas и pyplot для группировки по нескольким столбцам, получения значений значений и построения этой информации - PullRequest
0 голосов
/ 13 февраля 2020

Я анализирую некоторые прогоны данных из агентной модели, которая (TL; DR) имитирует жизненный цикл вида для прогнозирования показателей выживаемости с учетом определенных входных параметров. Я борюсь с тем, как использовать pandas и pyplot для выполнения sh, и хотел бы получить несколько советов. У меня есть CSV, который выглядит так:

"run","day","Lifestate","Lat","Long","habitat_sample"
1, 1.0,"adult",0.0,0.0,0
1, 1.0,"adult",0.0,0.0,0
1, 1.0,"larva",0.0,0.0,0
1, 2.0,"adult",0.0,0.0,0
1, 2.0,"nymph",0.0,0.0,0
1, 2.0,"nymph",0.0,0.0,0
1, 2.0,"nymph",0.0,0.0,0
1, 3.0,"nymph",0.0,0.0,0
1, 3.0,"nymph",0.0,0.0,0
1, 3.0,"nymph",0.0,0.0,0
1, 4.0,"nymph",0.0,0.0,0
1, 4.0,"nymph",0.0,0.0,0
1, 4.0,"nymph",0.0,0.0,0
1, 4.0,"nymph",0.0,0.0,0
2, 1.0,"adult",0.0,0.0,0
2, 1.0,"adult",0.0,0.0,0
2, 1.0,"adult",0.0,0.0,0
3, 1.0,"nymph",0.0,0.0,0
3, 1.0,"nymph",0.0,0.0,0
3, 2.0,"larva",0.0,0.0,0
3, 2.0,"larva",0.0,0.0,0

Что мне нужно сделать, это построить график выживаемости различных продолжительности жизни для каждого запуска. Другими словами, для каждого пробега мне нужно составить график количества взрослых особей, личинок и нимф на каждый день. Итак, в первый день было 3 взрослых, 1 нимфа, 2 личинки. 2 день было 2 взрослых, 2 нимфы, 6 личинок и др. c. Я хотел бы закончить с чем-то вроде этого (извинения за набросок дерьма):

enter image description here

Я очень плохо знаком с pandas и борюсь обернуть голову вокруг всех доступных мне техник. Я не могу понять, как разбить и построить столбец «Lifestate» по количеству взрослых / нимф / личинок в день. Я пробовал Группировать по run / tick и получать value_counts() для столбца lifestate, пробовал группировать, просто запустив и извлекая количество людей на одну продолжительность жизни, et c. Я могу получить числа, которые я хочу, но я не могу получить их так, чтобы я мог построить их. Не имеет смысла отображать дни против value_counts, так как они оказываются разными измерениями, верно? Я чувствую, что мои итеративные подходы неэффективны, и мой инстинкт подсказывает мне, что это неправильный подход. Пример одной из многих вещей, которые я пробовал:

grouped = data.groupby(['run','tick'])

for name, group in grouped_data:
    valcounts = group['Lifestate'].value_counts()

Это дает мне нужные мне числа, но потом я не уверен, как их построить. Еще одна проблема, будет ли цикличность замедляться, как только я начну использовать свои фактические (большие) наборы данных?

Моя текущая идея - попытаться извлечь нужные данные и создать новый фрейм данных для каждого прогона. , Я думаю, что хочу что-то подобное для каждого прогона;

"day","num_adults","num_nymphs", "num_larva"
1, 2, 4, 6
2, 1, 3, 5
3, 1, 3, 5
4, 1, 2, 4

и так далее. Похоже ли это на правильный подход к этой проблеме? Что я пропускаю / не думаю? И совет по логи c или дизайн будет принята с благодарностью. Благодаря.

1 Ответ

1 голос
/ 13 февраля 2020

Я не был уверен, что вы хотели сделать с «прогонами» в вашем примере. Если вам нужно рассмотреть каждый прогон отдельно, вот мое мнение:

mix = pd.MultiIndex.from_product([df['run'].unique(), df['day'].unique(), df['Lifestate'].unique()], names=['run','day','Lifestate'])
new = df.groupby(['run','day','Lifestate']).size().reindex(mix, fill_value=0).unstack().reset_index()

новый фрейм данных new выглядит так:

Lifestate  run  day  adult  larva  nymph
0            1  1.0      2      1      0
1            1  2.0      1      0      3
2            1  3.0      0      0      3
3            1  4.0      0      0      4
4            2  1.0      3      0      0

Тогда довольно просто построить график каждый прогон индивидуально:

# create one subplot by "run"
runs = new.groupby('run')
fig, axs = plt.subplots(len(runs), 1, sharex=True, sharey=True, constrained_layout=True)
for ax,(g,temp) in zip(axs,runs):
    temp.plot(x='day', y=['nymph','larva','adult'], ax=ax, legend=ax.is_first_row())
    ax.set_title("run #{:d}".format(g))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...