布尔索引的优雅方法,列表中有 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
对不起标题,我想不出一个简洁准确地描述这个问题的标题。
假设您有数据框,例如:
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