在列相同的pandas数据框中查找索引值

时间:2013-10-04 10:40:16

标签: python pandas dataframe

我有一个包含多列的数据框,其中索引是时间戳,另外三个是阶段编号指示符,其余的只是数据。我想要做的是找到三个指标列属于同一阶段类型,其中包含一个数字列表。

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分钟1分钟和4分钟一。

我最好查找已经发生的日期和时间,以便我可以使用其他数据列进一步调查。此外,这不太可能只是我必须这样做的时间,所以能够改变我感兴趣的数字和列将是好的。

到目前为止,我已经设法使用类似于以下代码:

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

and then for multiple ones:

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

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

任何帮助都会受到赞赏,因为我对python和编程一般都比较新。

1 个答案:

答案 0 :(得分: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,您可以使用

创建mask
mask = df[['PhaseA','PhaseB','PhaseC']].applymap(set([415,423,427,]).__contains__).all(axis=1)