【问题标题】:Python Data Frame: Create New Column Based on Values in a String Column and a Float ColumnPython 数据框:根据字符串列和浮点列中的值创建新列
【发布时间】:2017-10-21 22:58:23
【问题描述】:

我在下面有以下 Python 数据框。 “标志”字段是我想用代码创建的所需列。

我想做以下事情:

如果“分配类型”是预测的并且“活动计数器”大于 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

非常感谢任何帮助!

【问题讨论】:

    标签: python loops for-loop dataframe conditional


    【解决方案1】:

    您需要使用& 添加新条件。使用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  
    

    【讨论】:

    • 完美运行!非常感谢:)
    • 计时是计算机科学的一个组成部分,你可以让你的代码运行得更快吗?
    • 我认为这是最快的解决方案,我在我的电脑上进行了测试。
    猜你喜欢
    • 2022-07-07
    • 2021-11-18
    • 1970-01-01
    • 2022-08-10
    • 2018-04-17
    • 2022-01-21
    • 2021-10-03
    • 2021-11-30
    • 2022-11-16
    相关资源
    最近更新 更多