布尔索引的优雅方法,列表中包含可变/动态数值

时间:2017-05-16 20:38:19

标签: python pandas boolean-operations

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

假设您有数据框,例如:

                 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语句可以做到这一点?

4 个答案:

答案 0 :(得分:3)

如果我理解正确,您是否尝试对条件列表使用布尔索引?例如,请参阅下面的Dataframe:

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

答案 1 :(得分:2)

<强>设置

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)]

答案 2 :(得分:2)

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

答案 3 :(得分: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