2

我有一个包含多个列的数据框,其中索引是时间戳,另外三个是阶段编号指标,其余的只是数据。我要做的是找到三个指标列何时处于同一阶段类型,该阶段类型由数字列表之一组成。

So my data frame looks like this:
Index                    PhaseA   PhaseB   PhaseC   DataCol
01/07/2013  00:00:00     400      415      425      1.2
01/07/2013  00:01:00     415      420      410      1.2
01/07/2013  00:02:00     415      423      415      1.2
01/07/2013  00:03:00     415      423      420      1.2
01/07/2013  00:04:00     415      423      423      1.2
01/07/2013  00:05:00     415      423      425      1.2

因此,在这个简化的情况下,我正在寻找所有三个阶段数的值都是 415、423、427 和 432 的值。这意味着在这种情况下我想要获得的行是 2 分钟一和 4 分钟一。

我最好寻找发生这种情况的日期和时间,这样我就可以使用其他数据列进一步调查它。此外,这不太可能是我必须这样做的唯一时间,因此能够更改我感兴趣的数字和列会很好。

到目前为止,我已经设法让它与类似的代码一起工作:

df[ (df["PhaseA"] == (415))]

and then for multiple ones:

df[(df["PhaseA"] == (415))|(df["PhaseA"] == (420))]

但这很快就会变得非常混乱,以后很难修改。

任何帮助将不胜感激,因为我对 python 和一般编程比较陌生。

4

1 回答 1

5
mask = df[['PhaseA','PhaseB','PhaseC']].isin([415,423,427,432]).all(axis=1)
df.ix[mask]

例如,

In [51]: mask = df[['PhaseA','PhaseB','PhaseC']].isin([415,423,427,432]).all(axis=1)
In [52]: mask 
Out[52]: 
Index
2013-01-07 00:00:00    False
2013-01-07 00:01:00    False
2013-01-07 00:02:00     True
2013-01-07 00:03:00    False
2013-01-07 00:04:00     True
2013-01-07 00:05:00    False
dtype: bool

In [53]: df.ix[mask]

产量

Out[53]: 
                     PhaseA  PhaseB  PhaseC  DataCol
Index                                               
2013-01-07 00:02:00     415     423     415      1.2
2013-01-07 00:04:00     415     423     423      1.2

DataFrame.isin将添加到 Pandas v0.13 中。没有DataFrame.isin你可以创建maskwith

mask = df[['PhaseA','PhaseB','PhaseC']].applymap(set([415,423,427,]).__contains__).all(axis=1)
于 2013-10-04T11:08:12.570 回答