Можно построить подмножество столбцов на основе уникального значения в Пандах? - PullRequest
1 голос
/ 18 октября 2019

[ отредактировано 22.10.19 для ясности ]

Я нахожусь в процессе изучения того, как использовать Панд. У меня есть большой набор данных, который я хотел бы построить (линейный график) различными способами. Вот пример с столбцами Date, Sample Location, Test1, Test2, Test3 (целое число):

import itertools
import pandas as pd
import numpy as np

# Generate some data; covert dict to dataframe
MyDates = list(repeat(['1/1/19', '2/1/19', '3/1/19', '4/1/19', '5/1/19'], 5))
# repeat won't work if run from text editor
SampleSites = ['Site 1', 'Site 2', 'Site 3', 'Site 4', 'Site 5'] * 5
Test1 = list(randint(0, 10, 25))
Test2 = list(randint(0, 10, 25))
Test3 = list(randint(0, 10, 25))
MyData = {'Date': MyDates, 'Sample Location': SampleSites, 'Test 1': Test1, 'Test 2': Test2, 'Test 3': Test3}
DF1 = pd.DataFrame(MyData)
# Sometimes this doesn't work; not sure why.

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

# General approach that I have seen others do, I would like a more concise way if possible:

# Plot "Test 1" results for all Sample Locations
DF2 = DF1.drop(labels = ['Test 2', 'Test 3'], axis = 1)
DF3 = DF2.pivot_table(index = 'Date', columns = 'Sample Location')
DF3.plot()

# Plot columns Test 1, Test 2, and Test 3 for Sample Location 'Site 1'
# Select subset of data from DF1 to plot
FilterSamples = ['Site 1']
# Slice data frame down to desired type
DF2 = DF1[DF1['Sample Location'].isin(FilterSamples)]
DF3 = DF2.reset_index(drop = True)
DF3.plot(x = 'Date', y = ['Test 1', 'Test 2', 'Test 3'])

Этот подход кажется обременительным, так как, по-видимому, требуется передать несколько объектов, чтобы добраться туда, где должны быть данные для построения графика.

Было бы здоровоесли бы я мог иметь краткий способ построения графика из большого фрейма данных, где значения x и y могут быть отфильтрованы по соседним значениям в строке. Например, вместо того, чтобы фильтровать фрейм данных, чтобы он включал только местоположение образца «Сайт 1», было бы здорово, если бы я мог написать что-то вроде следующего:

# pseudo-code example of what I would like to do:
# Only plots x values (date) of rows with Site 1 value in Sample Location column
# Only plots corresponding y values for column Test 1
DF1.plot (x = DF1.Date[DF1.Sample Location['Site 1']], y = DF1.Test1)

# Is something like this possible?

Надеюсь, вопрос теперь более ясен. Будем благодарны за любые предложения / критические замечания относительно основного вопроса или любого аспекта моего кода!

1 Ответ

0 голосов
/ 18 октября 2019

Чтобы построить несколько слоев на одном графике, вы можете использовать pyplot непосредственно из matplotlib:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(15, 10))
plt.plot(df.columnA,df.columnB,color='red')
plt.plot(df.columnA,df.columnC,color='blue')

plt.legend(["ColumnB","ColumnC"])

plt.show()

Вы можете легко поиграть с осью, цветами и дизайном грао таким образом. Вы также можете работать напрямую, не создавая новый фрейм данных, например: plt.plot(df.columnA,df.columnA-df.columnB), например

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