选择 Pandas 中感兴趣的行前后的行
Selecting rows before and after rows of interest in Pandas
假设我有一个时间序列数据框,其中包含一个分类变量和一个值:
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 的行感兴趣,过滤以隔离它们是微不足道的。但是,如果我对 之前的 n 行 类别 A 也感兴趣怎么办?如果 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
同样,如果我对 周围的 n 行 A 类感兴趣怎么办?同样,如果 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
谢谢!
回答你的第一个问题:
df[pd.concat([df.category.shift(-i)=='A' for i in range(n)], axis=1).any(axis=1)]
希望您能够扩展相同的(可能有点笨拙的)方法来涵盖更多案例。
n
rows around category A's:
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
假设我有一个时间序列数据框,其中包含一个分类变量和一个值:
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 的行感兴趣,过滤以隔离它们是微不足道的。但是,如果我对 之前的 n 行 类别 A 也感兴趣怎么办?如果 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
同样,如果我对 周围的 n 行 A 类感兴趣怎么办?同样,如果 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
谢谢!
回答你的第一个问题:
df[pd.concat([df.category.shift(-i)=='A' for i in range(n)], axis=1).any(axis=1)]
希望您能够扩展相同的(可能有点笨拙的)方法来涵盖更多案例。
n
rows around category A's:
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