Pb与时间序列索引上的行选择

时间:2015-06-01 16:13:33

标签: python pandas time-series

有了这个玩具数据::

df = pd.DataFrame(pd.np.random.randint(2, 9, size=(8, 3)))
df.index = pd.date_range(start='2015-04', periods=8, freq='Q')
df
#             0  1  2
# 2015-06-30  7  5  5
# 2015-09-30  5  5  8
# 2015-12-31  2  4  3
# 2016-03-31  2  5  8
# 2016-06-30  2  2  3
# 2016-09-30  6  6  6
# 2016-12-31  8  5  3
# 2017-03-31  8  2  2

这项工作很好,我们可以过滤特定的月份::

df.loc[df.index.month == 9, :]
#             0  1  2
# 2015-09-30  5  5  8
# 2016-09-30  6  6  6

但是如何制造一个" isin"如果我们需要从列表中获取值,请过滤?::

df.loc[df.index.month in [6, 12], :]
# ---------------------------------------------------------------------------
# ValueError                                Traceback (most recent call last)
# <ipython-input-577-49bc5540b6dd> in <module>()
# ----> 1 df.loc[df.index.month in [6, 12], :]
# 
# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

1 个答案:

答案 0 :(得分:1)

您可以使用np.in1d()来测试1-D数组的每个元素是否也存在于第二个数组中。

In [32]: df.loc[np.in1d(df.index.month, [6, 12]), :]
Out[32]:
            0  1  2
2015-06-30  8  6  4
2015-12-31  2  3  4
2016-06-30  8  7  3
2016-12-31  4  7  3

但是,如果您只想使用'isin()'方法,可以将df.index.month转换为系列并检查isin([6, 12])条件

In [34]: df.loc[pd.Series(df.index.month).isin([6, 12]).values, :]
Out[34]:
            0  1  2
2015-06-30  8  6  4
2015-12-31  2  3  4
2016-06-30  8  7  3
2016-12-31  4  7  3

或者,你也可以

In [33]: df.loc[[x in [6, 12] for x in df.index.month], :]
Out[33]:
            0  1  2
2015-06-30  8  6  4
2015-12-31  2  3  4
2016-06-30  8  7  3
2016-12-31  4  7  3