python - Pandas DataFrame 获取索引符合特定条件的行

标签 python pandas dataframe

我有一个 Pandas 数据框,我需要从中获取索引与特定条件匹配的所有行。数据框有一个 MultiIndex,我需要第一个索引 TimeStamp 位于特定范围内的行。 MultiIndex 的级别 1 是一系列 DateTime 对象。下面这行代码用于检查月份是否等于 5:

compare[compare.index.get_level_values(0).month == 5]

但是当我修改代码以检查值在某个数组中的行时

compare[compare.index.get_level_values(0).month in [5, 6, 7]]

我得到了错误

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我还尝试使用 df.loc 来获取值。

compare.loc[compare.index.get_level_values(0).month in [5, 6, 7]]

但这会导致同样的错误。

我也尝试使用 isin 方法。

compare[compare.index.get_level_values(0).month.isin([5, 6, 7])]

但这会导致以下属性错误:

AttributeError: 'numpy.ndarray' object has no attribute 'isin'

如何获取索引满足特定条件的 DataFrame 行?

最佳答案

试试这个:

compare[compare.index.get_level_values(0).month.isin([5, 6, 7])]

附言this should work for Pandas version 0.18.1+

演示:

In [45]: import pandas_datareader.data as web

In [46]: df = web.DataReader('AAPL', 'google', '2017-06-01')

In [48]: df = df.assign(i2=np.arange(len(df))).set_index('i2', append=True)

In [49]: df
Out[49]:
                 Open    High     Low   Close    Volume
Date       i2
2017-06-01 0   153.17  153.33  152.22  153.18  16404088
2017-06-02 1   153.58  155.45  152.89  155.45  27770715
2017-06-05 2   154.34  154.45  153.46  153.93  25331662
2017-06-06 3   153.90  155.81  153.78  154.45  26624926
2017-06-07 4   155.02  155.98  154.48  155.37  21069647
2017-06-08 5   155.25  155.54  154.40  154.99  21250798
2017-06-09 6   155.19  155.19  146.02  148.98  64882657
2017-06-12 7   145.74  146.09  142.51  145.42  72307330
2017-06-13 8   147.16  147.45  145.15  146.59  34165445
2017-06-14 9   147.50  147.50  143.84  145.16  31531232
...               ...     ...     ...     ...       ...
2017-07-31 41  149.90  150.33  148.13  148.73  19845920
2017-08-01 42  149.10  150.22  148.41  150.05  35368645
2017-08-02 43  159.28  159.75  156.16  157.14  69936800
2017-08-03 44  157.05  157.21  155.02  155.57  27097296
2017-08-04 45  156.07  157.40  155.69  156.39  20559852
2017-08-07 46  157.06  158.92  156.67  158.81  21870321
2017-08-08 47  158.60  161.83  158.27  160.08  36205896
2017-08-09 48  159.26  161.27  159.11  161.06  26131530
2017-08-10 49  159.90  160.00  154.63  155.32  40804273
2017-08-11 50  156.60  158.57  156.07  157.48  26180743

[51 rows x 5 columns]

In [50]: df[df.index.get_level_values(0).month.isin([5,8])]
Out[50]:
                 Open    High     Low   Close    Volume
Date       i2
2017-08-01 42  149.10  150.22  148.41  150.05  35368645
2017-08-02 43  159.28  159.75  156.16  157.14  69936800
2017-08-03 44  157.05  157.21  155.02  155.57  27097296
2017-08-04 45  156.07  157.40  155.69  156.39  20559852
2017-08-07 46  157.06  158.92  156.67  158.81  21870321
2017-08-08 47  158.60  161.83  158.27  160.08  36205896
2017-08-09 48  159.26  161.27  159.11  161.06  26131530
2017-08-10 49  159.90  160.00  154.63  155.32  40804273
2017-08-11 50  156.60  158.57  156.07  157.48  26180743

更新:使用您的索引值进行测试:

In [56]: i = pd.DatetimeIndex(['2016-01-04 01:40:00', '2016-01-04 02:00:00', '2016-01-04 02:10:00', '2016-01-04 02:30:00', '2016-01-04 02:4
    ...: 0:00'], dtype='datetime64[ns]', name=u'TTimeStamp', freq=None)

In [57]: i
Out[57]: DatetimeIndex(['2016-01-04 01:40:00', '2016-01-04 02:00:00', '2016-01-04 02:10:00', '2016-01-04 02:30:00', '2016-01-04 02:40:00'],
dtype='datetime64[ns]', name='TTimeStamp', freq=None)

In [58]: i.month
Out[58]: Int64Index([1, 1, 1, 1, 1], dtype='int64', name='TTimeStamp')

In [59]: i.month.isin([2,3])
Out[59]: array([False, False, False, False, False], dtype=bool)

In [60]: i.month.isin([1,2,3])
Out[60]: array([ True,  True,  True,  True,  True], dtype=bool)

UPDATE2:尝试以下解决方法:

compare[pd.Series(compare.index.get_level_values(0).month).isin([5, 6, 7]).values]

关于python - Pandas DataFrame 获取索引符合特定条件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45644857/

相关文章:

python - Django ORM : Equivalent of SQL `NOT IN` ? `exclude`和 `Q`对象不起作用

python - 我如何将垂直线添加到他们选择的 seaborn dist 地 block ? [单个地 block 中的多个分布]

python - 计算 Pandas 数据框中每列值的变化

使用 tidyr reshape data.frame

r - 在R中的数据表的列中删除一个单词

python - Pandas DataFrame 从列中获取子字符串

python - 从两个字符串获取后缀/前缀修正,将源字符串转换为Python中的目标字符串

python - 在 groupby 之后取回 Pandas DataFrame 中的数据

python - pandas 数据框中的值过滤器保持 NaN

python - Pandas Groupby Dates,然后是 Group 的 Cumprod?