如何根据另一列的值来屏蔽熊猫列?

时间:2019-05-12 17:30:22

标签: python pandas matplotlib nan

我有一个熊猫数据框(存储在excel中),其中包含一些组的时间序列。 我想为这些组绘制时间序列的线图。我无法把自己的头缠在pyplot中的掩蔽图上。我需要在冬季遮盖住地块(地块中的缝隙)。

我的出发点是此页面: https://matplotlib.org/gallery/lines_bars_and_markers/masked_demo.html

我看过有关熊猫面膜及其功能的文档。 我还看到了numpy.ma.masked_where函数文档。

我可以使用pandas.mask函数-但只能用于一列。我想不通一种使用['Months']列掩盖我的['Values']列的方法。

我尝试使用pandas.as_matrix()将两列导出到numpy。然后,我使用numpy.ma.masked_where屏蔽了['Values']。但是,当我尝试将其放回pandas数据框中时,它正在屏蔽,并且值仍然存在。

#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 :(得分:0)

我认为您需要

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)

然后,您可以通过以下方式绘制除monthw中的那些值以外的所有值:

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