Python - 如何根据列的值进行累加和

Python - How to do accumulative sums depending on the value of a column

我有一个数据框,我想添加一列,该列应该是其中一列的累计总和,但前提是另一列的值是特定的。

比如我的dataframe如下:

| Type | Quantity |

| A | 30 |

| B | 10 |

| B | 5 |

| A | 3 |

我想添加一列SumA,它只会在Type == A时计算数量的累计总和。

我试过这个:

data['SumA'] = data['Quantity'].cumsum() if data[(data['Type'] == 'A')]

我不断收到错误,我不确定如何解决它们,有人可以帮帮我吗?

谢谢你和亲切的问候,

我想得到这样的东西:

| Type | Quantity | Sum A | Sum B |

| A | 30 | 30 | 0 |

| B | 10 | 30 | 10 |

| B | 5 | 30 | 15 |

| A | 3 | 33 | 15 |

您在此处遇到的错误是语法错误。 Pandas 不支持使用 if 命令的行的 selection。

而不是select你想要的行你可以这样做:

data[(data['Type'] == 'A')]['Quantity']

这将显示类型等于 'A'

的行的数量列

所以在你的情况下,为了让这段代码工作,这将变成:

data['sumA'] = data[(data['Type'] == 'A')]['Quantity'].cumsum() 

为了获得预期的输出,您只需对 A 列和 B 列执行两次此操作并填充任何缺失的 nan 值。

data['sumA'] = data[(data['Type'] == 'A')]['Quantity'].cumsum() 
data['sumB'] = data[(data['Type'] == 'B')]['Quantity'].cumsum() 

# Fill nan values with the previously available value
data.fillna(method='ffill', inplace=True)

# The first values don't have any previous value, so fill with zero
data.fillna(value=0, inplace=True)

这个returns期望值

我考虑了一些肯定可以优化的通用解决方案(我会尝试并继续研究它):

因此我们遍历 Type 列的唯一值以创建 sum{value} 列,然后每一列将包含其尊重的 Type 值的 cumsum 而不匹配的值将是 NaN.

然后我用最接近的有效值填充 NaN 值,最后一行是为了满足特殊情况,即行中的第一项是 NaN 并且需要是 0

for column in data['Type'].unique():
  column_name = f'sum{column}'
  data[column_name] = data[data['Type'] == column]['Quantity'].cumsum()
  data[column_name].fillna(method='ffill', inplace=True)
  data[column_name].fillna(value=0, inplace=True)

输出:

    Type    Quantity    sumA   sumB
0   A       30          30.0   0.0
1   B       10          30.0   10.0
2   B       5           30.0   15.0
3   A       3           33.0   15.0