布尔索引的优雅方法,列表中有 variable/dynamic 个值

Elegant method for Boolean Indexing with variable/dynamic number of values in list

对不起标题,我想不出一个简洁准确地描述这个问题的标题。

假设您有数据框,例如:

                 Time           Temp      RH     Sensor  Unit  
0        2015-12-07 00:06:00  14.912000  42.324      A     1      
1        2015-12-07 00:12:00  14.768000  42.371      A     2      
2        2015-12-07 00:18:00  14.601000  42.415      A     1
3        2015-12-07 00:24:00  14.457000  42.462      A     4
...

并且您想通过 Unit 列对这些数据进行子集化。如果你有 Unit 你想用来创建你可以做的子集:

 subset = df[df['Unit'] == 4]

...如果您想使用多个 Unit 值进行子集化,您可以这样做:

subset = df[(df['Unit'] == 4) | (df['Unit'] == 1)]

我遇到的问题是我正在使用 for 循环来执行这些操作,并且包含的​​ Unit 数量发生了变化(值列表的长度从 1-3 不等)。换句话说,假设 Unit 是我正在循环的列表列表:

for i in Unit:
    subset = df[(df['Unit'] == i]
    ...

当然,当 i 是一个单值时,上面的方法将起作用,但当它是多个值的列表时则不起作用。有没有办法在没有 if 语句的情况下做到这一点?

设置

df
Out[2350]: 
                  Time    Temp      RH Sensor  Unit
0  2015-12-07 00:06:00  14.912  42.324      A     1
1  2015-12-07 00:12:00  14.768  42.371      A     2
2  2015-12-07 00:18:00  14.601  42.415      A     1
3  2015-12-07 00:24:00  14.457  42.462      A     4

解决方案

#use np.in1d to match multiple Unit values.
df[np.in1d(df.Unit,[1,2])]
Out[2351]: 
                  Time    Temp      RH Sensor  Unit
0  2015-12-07 00:06:00  14.912  42.324      A     1
1  2015-12-07 00:12:00  14.768  42.371      A     2
2  2015-12-07 00:18:00  14.601  42.415      A     1

然后您可以构建您的单位价值列表并使用:

df[np.in1d(df.Unit,your_unit_value_list)]

如果我没理解错的话,您是想对条件列表使用布尔索引?例如,参见下面的数据框:

df
       a
0     12
1  65346
2   1243
3     63
4    568
5    243

并且您想在此条件列表上建立索引:

conditions = [12, 568]

您可以使用系列方法isin()

df[df['a'].isin(conditions)]

     a
0   12
4  568
subset = df[df['Unit'].isin([1,2])]
#                  Time    Temp      RH Sensor  Unit
#0 2015-12-07  00:06:00  14.912  42.324      A     1
#1 2015-12-07  00:12:00  14.768  42.371      A     2
#2 2015-12-07  00:18:00  14.601  42.415      A     1

多一个选项:

In [15]: x
Out[15]:
                  Time    Temp      RH Sensor  Unit
0  2015-12-07 00:06:00  14.912  42.324      A     1
1  2015-12-07 00:12:00  14.768  42.371      A     2
2  2015-12-07 00:18:00  14.601  42.415      A     1
3  2015-12-07 00:24:00  14.457  42.462      A     4

In [16]: units = [1,2]

In [17]: x.query("Unit in @units")
Out[17]:
                  Time    Temp      RH Sensor  Unit
0  2015-12-07 00:06:00  14.912  42.324      A     1
1  2015-12-07 00:12:00  14.768  42.371      A     2
2  2015-12-07 00:18:00  14.601  42.415      A     1