【问题标题】:Selecting rows before and after rows of interest in Pandas在 Pandas 中选择感兴趣的行之前和之后的行
【发布时间】:2017-06-28 02:33:13
【问题描述】:

假设我有一个带有分类变量和值的时间序列数据框:

In [4]: df = pd.DataFrame(data={'category': np.random.choice(['A', 'B', 'C', 'D'], 11), 'value': np.random.rand(11)}, index=pd.date_range('2015-04-20','2015-04-30'))

In [5]: df
Out[5]:
           category     value
2015-04-20        D  0.220804
2015-04-21        A  0.992445
2015-04-22        A  0.743648
2015-04-23        B  0.337535
2015-04-24        B  0.747340
2015-04-25        B  0.839823
2015-04-26        D  0.292628
2015-04-27        D  0.906340
2015-04-28        B  0.244044
2015-04-29        A  0.070764
2015-04-30        D  0.132221

如果我对 A 类行感兴趣,过滤以隔离它们是微不足道的。但是,如果我也对类别 A 之前 的 n 行感兴趣怎么办?如果 n=2,我希望看到类似的内容:

In [5]: df[some boolean indexing]
Out[5]:
           category     value
2015-04-20        D  0.220804
2015-04-21        A  0.992445
2015-04-22        A  0.743648
2015-04-27        D  0.906340
2015-04-28        B  0.244044
2015-04-29        A  0.070764

同样,如果我对 类别 A 的 n 行感兴趣怎么办?同样,如果 n=2,我想看看这个:

In [5]: df[some other boolean indexing]
Out[5]:
           category     value
2015-04-20        D  0.220804
2015-04-21        A  0.992445
2015-04-22        A  0.743648
2015-04-23        B  0.337535
2015-04-24        B  0.747340
2015-04-27        D  0.906340
2015-04-28        B  0.244044
2015-04-29        A  0.070764
2015-04-30        D  0.132221

谢谢!

【问题讨论】:

标签: python pandas indexing selection


【解决方案1】:

n A 类周围的行:

In [223]: idx = df.index.get_indexer_for(df[df.category=='A'].index)

In [224]: n = 1

In [225]: df.iloc[np.unique(np.concatenate([np.arange(max(i-n,0), min(i+n+1, len(df)))
                                            for i in idx]))]
Out[225]:
           category     value
2015-04-20        D  0.220804
2015-04-21        A  0.992445
2015-04-22        A  0.743648
2015-04-23        B  0.337535
2015-04-28        B  0.244044
2015-04-29        A  0.070764
2015-04-30        D  0.132221

In [226]: n = 2

In [227]: df.iloc[np.unique(np.concatenate([np.arange(max(i-n,0), min(i+n+1, len(df)))
                                            for i in idx]))]
Out[227]:
           category     value
2015-04-20        D  0.220804
2015-04-21        A  0.992445
2015-04-22        A  0.743648
2015-04-23        B  0.337535
2015-04-24        B  0.747340
2015-04-27        D  0.906340
2015-04-28        B  0.244044
2015-04-29        A  0.070764
2015-04-30        D  0.132221

【讨论】:

  • 在查看分组数据框时有什么想法可以解决这个问题吗?
【解决方案2】:

回答你的第一个问题:

df[pd.concat([df.category.shift(-i)=='A' for i in range(n)], axis=1).any(axis=1)]

希望您能够扩展相同(可能有点笨拙)的方法以涵盖更多案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2021-01-05
    • 2011-08-10
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多