有了这个玩具数据:
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()
最佳答案
您可以使用np.in1d()
测试一维数组的每个元素在第二个数组中是否也存在。
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
关于python - 在时间序列索引上具有行选择的Pb,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30578303/