【问题标题】:Dataframe assignment not working inside nested for loop数据框分配在嵌套 for 循环中不起作用
【发布时间】:2020-06-26 23:14:10
【问题描述】:

我正在使用具有多个组的 pandas 数据框:

date | group | brand | calculated_value
_______________________________
5    | 1     | x     | 1
6    | 1     | x     | NaN
7    | 1     | x     | NaN
5    | 2     | y     | 1
6    | 2     | y     | NaN

在每个日期、组和品牌中,我都使用计算值初始化了第一个实例。我正在使用嵌套的 for 循环遍历这些,以便我可以更新和分配计算值的下一个连续日期出现(在 date-group-brand 内)。

groupby()/apply() 范式对我不起作用,因为在例如上面的第三行,传递给 apply() 的函数在上面查找并找到 NaN。这不是顺序更新。

计算值后,我尝试将其分配给有问题的单元格,使用正确的语法来避免 CopySettings 问题:

df.loc[ (df.date == 5) & (df.group == 1) & (df.brand == 'x'), "calculated_value" ] = calc_value

但是,这无法设置单元格,它仍然是 NaN。这是为什么?我尝试搜索了许多术语,但找不到与我的案例相关的答案。

我已确认每个 for 循环都在正确递增,并且我在每次迭代中处理了正确的行。

编辑:我发现了问题。当我将单元格作为单独的参数传递给 calculate_function 时,它们每个都作为单值系列传递,并且该函数返回一个单值系列,不能将其分配给 NaN 单元格。不匹配的赋值没有抛出错误,for 循环也没有终止。

我通过传递解决了这个问题

calculate_function(arg1.values[0], arg2.values[0], ...) 

提取值数组并获取其第一个索引似乎不优雅且脆弱,但与我在 R 中习惯的行为相比,默认行为是一种古怪的行为。

【问题讨论】:

    标签: pandas dataframe for-loop nested


    【解决方案1】:

    您可以使用groupby().idxmin() 来识别每组group, band 中的第一个date

    s = df.groupby(['group', 'brand']).date.idxmin()
    
    df.loc[s,'calculated_value'] = 1
    

    输出:

       date  group brand  calculated_value
    0     5      1     x               1.0
    1     6      1     x               NaN
    2     7      1     x               NaN
    3     5      2     y               1.0
    4     6      2     y               NaN
    

    【讨论】:

      【解决方案2】:

      我会和min一起做transform

      s=df.groupby(['group','brand']).date.transform('min')
      df['calculated_value']=df.date.eq(s).astype(int)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 2016-10-10
        相关资源
        最近更新 更多