有了这个玩具数据::
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()
答案 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