我有一个包含多列的数据框,其中索引是时间戳,另外三个是阶段编号指示符,其余的只是数据。我想要做的是找到三个指标列属于同一阶段类型,其中包含一个数字列表。
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和编程一般都比较新。
答案 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)