2016-07-18 108 views
1

我有一个数据帧data它看起来像一个数据帧列:灌装基于多个条件选择

Holiday Report Action  Power 
0    0  0  1.345 
0    0  0  1.345 
1    0  0  0 
0    0  0  1.345 
0    0  0  1.345 
0    1  0  0 
0    0  0  1.345 
0    1  1  0 
0    0  0  1.345 
0    0  1  0 

列“假日”,“报告”和“操作”在拉着寻找一个功率进行计算。一些其他数据列。我正在寻找一行代码,如果有任何“假期”,“报告”或“操作”列设置为1,我可以将电源设置为零。

我可以执行此过程一列在一段时间:

data.loc[staticidx, "power"] = np.where(dayData.Holiday = 1, 0, (a - b)/(c-1)) 
data.loc[staticidx, "power"] = np.where(dayData.Report= 1, 0, (a - b)/(c-1)) 
data.loc[staticidx, "power"] = np.where(dayData.Actions= 1, 0, (a - b)/(c-1)) 

但是有没有办法将它们合并成一个函数,像一个OR语句的东西?

非常感谢

回答

3

您可以通过切片子查询行,比较对1和使用any与PARAM axis=1,并创建一个布尔面具传递给loc设置只有那些满足所期望的条件1行:

In [23]: 
df.loc[(df.ix[:,:'Action'] == 1).any(axis=1), 'Power'] = 1 
df 

Out[23]: 
    Holiday Report Action Power 
0  0  0  0 1.345 
1  0  0  0 1.345 
2  1  0  0 1.000 
3  0  0  0 1.345 
4  0  0  0 1.345 
5  0  1  0 1.000 
6  0  0  0 1.345 
7  0  1  1 1.000 
8  0  0  0 1.345 
9  0  0  1 1.000 
+0

也许事端g like:'np.where((df.ix [:,:'Action'] == 1).any(axis = 1),0,1.345)'? – Divakar

+0

@Divakar处理所有行,在这里使用'loc'只会更新符合条件的行,而不会改变任何现有的值 – EdChum

+0

哦,是的。所以,我猜你可以避免'> 0'并且赋值需要是'0'而不是'1'? – Divakar

1

希望这有助于使用np.where

In[49]:df['Power']=np.where((df['Holiday']==1)|(df['Report']==1)|(df['Action']==1),1,df['Power']) 

In[50]:df 
Out[50]: 
    Holiday Report Action Power 
0  0  0  0 1.345 
1  0  0  0 1.345 
2  1  0  0 1.000 
3  0  0  0 1.345 
4  0  0  0 1.345 
5  0  1  0 1.000 
6  0  0  0 1.345 
7  0  1  1 1.000 
8  0  0  0 1.345 
9  0  0  1 1.000