对不起标题,我无法想出一个简洁明了地描述这个问题的人。准确。
假设您有数据框,例如:
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
语句可以做到这一点?
答案 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