2017-05-22 138 views
1

下面我有以下Python数据帧值创建新列。 “标志”字段是我想用代码创建的我想要的列。Python的数据帧:基于对字符串列和浮动列

enter image description here

我要做到以下几点:

如果“分配类型”中预测,并且“Activities_Counter”大于10,我想创建一个名为“举报”新列,并贴上标签以“国旗”

行否则,离开旗行空白。

我用下面的代码来识别/标志,其中“Activities_Counter”大于10 ...但我不知道如何把“分配类型”的标准到我的代码。

Flag = [] 

for row in df_HA_noHA_act['Activities_Counter']: 
    if row >= 10: 
     Flag.append('Flag') 
    else: 
     Flag.append('') 

df_HA_noHA_act['Flag'] = Flag 

任何帮助,非常感谢!

回答

2

您需要&添加新的条件。也快是使用numpy.where

mask = (df_HA_noHA_act["Allocation Type"] == 'Predicted') & 
     (df_HA_noHA_act['Activities_Counter'] >= 10) 
df_HA_noHA_act['Flag'] = np.where(mask, 'Flag', '') 

df_HA_noHA_act = pd.DataFrame({'Activities_Counter':[10,2,6,15,11,18], 
           'Allocation Type':['Historical','Historical','Predicted', 
                'Predicted','Predicted','Historical']}) 
print (df_HA_noHA_act) 
    Activities_Counter Allocation Type 
0     10  Historical 
1     2  Historical 
2     6  Predicted 
3     15  Predicted 
4     11  Predicted 
5     18  Historical 

mask = (df_HA_noHA_act["Allocation Type"] == 'Predicted') & 
     (df_HA_noHA_act['Activities_Counter'] >= 10) 
df_HA_noHA_act['Flag'] = np.where(mask, 'Flag', '') 
print (df_HA_noHA_act) 
    Activities_Counter Allocation Type Flag 
0     10  Historical  
1     2  Historical  
2     6  Predicted  
3     15  Predicted Flag 
4     11  Predicted Flag 
5     18  Historical  

循环慢的解决方案:

Flag = [] 
for i, row in df_HA_noHA_act.iterrows(): 
    if (row['Activities_Counter'] >= 10) and (row["Allocation Type"] == 'Predicted'): 
     Flag.append('Flag') 
    else: 
     Flag.append('') 
df_HA_noHA_act['Flag'] = Flag 
print (df_HA_noHA_act) 
    Activities_Counter Allocation Type Flag 
0     10  Historical  
1     2  Historical  
2     6  Predicted  
3     15  Predicted Flag 
4     11  Predicted Flag 
5     18  Historical  

时序

df_HA_noHA_act = pd.DataFrame({'Activities_Counter':[10,2,6,15,11,18], 
           'Allocation Type':['Historical','Historical','Predicted', 
                'Predicted','Predicted','Historical']}) 
print (df_HA_noHA_act) 
#[6000 rows x 2 columns] 
df_HA_noHA_act = pd.concat([df_HA_noHA_act]*1000).reset_index(drop=True) 

In [187]: %%timeit 
    ...: df_HA_noHA_act['Flag1'] = np.where((df_HA_noHA_act["Allocation Type"] == 'Predicted') & (df_HA_noHA_act['Activities_Counter'] >= 10), 'Flag', '') 
    ...: 
100 loops, best of 3: 1.89 ms per loop 

In [188]: %%timeit 
    ...: Flag = [] 
    ...: for i, row in df_HA_noHA_act.iterrows(): 
    ...:  if (row['Activities_Counter'] >= 10) and (row["Allocation Type"] == 'Predicted'): 
    ...:   Flag.append('Flag') 
    ...:  else: 
    ...:   Flag.append('') 
    ...: df_HA_noHA_act['Flag'] = Flag 
    ...: 
    ...: 
1 loop, best of 3: 381 ms per loop 
+0

完美地工作!非常感谢你:) – PineNuts0

+0

是定时计算机科学的一个组成部分,你可以得到你的代码运行得更快? – PineNuts0

+0

我认为这是最快的解决方案,我在我的电脑测试。 – jezrael