Python 列表中具有可变/动态值数的布尔索引的优雅方法
很抱歉,我想不出一个能简洁准确地描述这个问题的标题 假设您有数据帧,例如:Python 列表中具有可变/动态值数的布尔索引的优雅方法,python,pandas,boolean-operations,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-
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
...
您希望通过单元
列对这些数据进行子集划分。如果您有要用于创建子集的单元
,可以执行以下操作:
subset = df[df['Unit'] == 4]
subset = df[(df['Unit'] == 4) | (df['Unit'] == 1)]
…如果要使用多个单位值进行子集,可以执行以下操作:
subset = df[df['Unit'] == 4]
subset = df[(df['Unit'] == 4) | (df['Unit'] == 1)]
我遇到的问题是,我使用for循环来执行这些操作,并且包含的单元的数量发生了变化(值列表的长度从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()
还有一个选择:
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
谢谢安德鲁!这正是我需要的。谢谢你的帮助,戴兹!谢谢你,艾伦!这是一个很好的解决方案,但我认为Andrew L和DYZ的解决方案更优雅一些。@user2970409,我想这是最快的解决方案