【问题标题】:How to create running total and restart it every time NaN appears?每次出现 NaN 时如何创建运行总计并重新启动它?
【发布时间】:2020-06-24 01:12:47
【问题描述】:

我想在每次遇到 nan 时启动一个新的运行总计 例如,从所附图片中,它将前 3 个值求和 [1242536, 379759, 1622295],然后显示运行总计 3244590.0,然后它将从第 5 个值开始新的运行总计,直到第 9 个,显示这些值的总和等等。我想将这些运行总计放在这些 NaN 值旁边的新列中。

我已尝试通过以下方式解决此问题:

for i in df['Budget_Expenditure_2012_']:
        if np.isnan(i) == True:
            x = pd.Index(df['Budget_Expenditure_2012_']).get_loc(i)

    
print(x)

for item in range(0, len(x) - 1, 2):
    second_list.append([x[item],x[item + 1]])    
print(second_list)

这个想法是找到每对行之间的值的总和。这对将是需要求和的每个范围的开始位置和最后位置。 在这一点上,我迷失了如何执行这个求和运算。

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!这个网站不是为了“我该怎么做?”问题。如果您尝试过但没有成功,我们可以为您提供帮助。
  • 或者我明白了,谢谢。我会尝试展示我尝试做的方式。
  • 不确定如何在版主关闭之前隐藏此问题
  • 问题底部的“分享”和“编辑”旁边有一个“删除”选项。
  • 这个问题现在看起来更好,还是质量仍然很差?

标签: python


【解决方案1】:

使用shiftisnacumsum 的组合到gropuby,然后transform,最后分配列为nan 的结果值

df.loc[df['Budget_Expenditure_2012_'].isna(), 'new_column'] = (
    df.groupby(
        df.Budget_Expenditure_2012_.shift()
                                   .isna()
                                   .cumsum()
    )['Budget_Expenditure_2012_'].transform('sum')
)

【讨论】:

  • 你能帮我理解这段代码是如何工作的吗?所以你选择 ['Budget_Expenditure_2012_'] 但特别是在哪里是 nan,然后你选择一个 ['new column'] 来放置结果。您使用 groupby.transform 将 groupby 对象转换为系列。在 groupby 里面你移动下面的第 1 行,为什么?然后您检查 nan 并将其转换为布尔值,然后以某种方式累积原始值。它是如何工作的 XD
  • 一步一步地做,所以首先是shift,转移的原因是第一个值为NaN,然后其余的值只是一个预处理步骤。然后isnacumsum 这基本上将为共享同一组的行分配一个唯一整数,这样你就可以执行groupby。在groupby 之后,您执行transform('sum') 这将执行组的总和,但返回与输入数据具有相同索引的系列,这样您就可以为此输出分配一个新变量,在这种情况下为@987654335 @。再次尝试一步一步地做。
  • 只是快速更新,如果您不进行移位,那么您的组将在输出中移位,请尝试不使用shift 进行操作,以便您发现差异。
  • 非常感谢您的解释,我学到了一个很酷的技巧
【解决方案2】:

使用此代码,您可以在名为“Totals”的新列上获取每个 nan 的“运行总计”。

total = 0
df['Totals'] = 0 # assign 0 initially to all rows of the new column

for i in range(df.shape[0]): # shape[0] return number of rows

    expenditure = df.loc[i+1, 'Budget_Expenditure_2012_'] # i+1 coz your indexing starts at 1

    if np.isnan(expenditure):
        df.loc[i, 'Totals'] = total
        total = 0
    else:
        total += expenditure

【讨论】:

  • 如果它出现在新列中将有很大帮助,现在尝试检查此代码
  • 如果 np.isnan(i): 输入类型不支持 ufunc 'isnan',并且根据转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型。这就是我得到的,当我尝试使用您的解决方案,试图调查问题时
  • 是的,我已经更新了代码。它出现在一个名为“总计”的新列中,位于相应的 nan 值旁边
  • 你确定它是一个浮点数吗?而不是一个字符串?你能打字吗(df.loc[4, 'Budget_Expenditure_2012_'])
  • 我很确定它是浮动的,我在我的代码之前使用了 df['Budget_Expenditure_2012_'] = pd.to_numeric(df['Budget_Expenditure_2012_'], downcast="float") 。我只是尝试检查类型,它显示 KeyError: 0 without clear explanation(非常长的错误日志)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2021-12-17
  • 2021-06-29
  • 2023-03-06
  • 2012-03-17
  • 2016-01-28
相关资源
最近更新 更多