Как замаскировать столбец панд на основе значений из другого столбца? - PullRequest
1 голос
/ 12 мая 2019

У меня есть датафрейм pandas (хранится в excel) с временными рядами для некоторых групп. Я хочу сделать линейный график временных рядов для этих групп. Я не могу обернуться вокруг маскировочных заговоров в pyplot. Мне нужно замаскировать участки (пробел на графике) в зимние месяцы.

Моей отправной точкой была эта страница здесь: https://matplotlib.org/gallery/lines_bars_and_markers/masked_demo.html

Я видел документацию для маски панд и где функционирует. Я также видел документацию по функции numpy.ma.masked_where.

Я мог бы использовать функцию pandas.mask - но только для одного столбца. Я не могу найти способ использовать столбец ['Месяцы'] для маскировки моего столбца ['Значения'].

Я попытался экспортировать оба столбца в numpy с помощью pandas.as_matrix (). Затем я замаскировал ['Значения'], используя numpy.ma.masked_where. Однако, когда я попытался поместить его обратно в pandas dataframe, он не маскируется, и значения все еще там.

#Lets say I have a dataframe called df. 
#It has following columns [['Date','Month', 'Values', 'GroupName']]

#This works, and the values seem to be masked, because they print as --
months = df['Month'].as_matrix()
values = df['Values'].as_matrix()
masked = np.ma.masked_where(months in ['5','6','7','8','9'], values)

#However this here unmasks the values =(
df['MaskedValues'] = masked

#This is how I do the plotting - I plot values from each group onto one plot

fig, ax = plt.subplots()

#Loops over groups and adds them to the plot
for key, group in df.groupby(['GroupName']):
    ax = group.plot(ax=ax, kind='line', x='Date', y='MaskedValues', label=key, figsize=(40,15), fontsize=30, color='black')

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

1 Ответ

0 голосов
/ 12 мая 2019

Я думаю, что вам нужно в вашем случае

fig, ax = plt.subplots(figsize=(40, 15))
w = (10, 11, 12, 1, 2, 3, 4)
for key, group in df.groupby(['GroupName']):
    group.mask(df.Month.isin(w)).plot(ax=ax, x='Date', y='Values', label=key, fontsize=30, color='black')

Обратите внимание, что вам не нужно назначать топор на каждой итерации, и figsize должен быть помещен в подзаговоры.


Я дам вам mcve, который представляет собой синусоидальные данные за два года:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

t = pd.date_range('1.1.2000', '31.12.2001')
data = np.sin(np.arange(len(t.day))/10)

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

df = pd.DataFrame({'value': data, 'month': t.month}, index=t)

( В моем примере зима заканчивается уже после марта ...:) )

w = (10, 11, 12, 1, 2, 3)

Затем вы можете построить все значения, кроме этихгде month находится в w по:

df.value.mask(df.month.isin(w)).plot()
plt.show()
...