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
我有一个数据框,我想添加一列,该列应该是其中一列的累计总和,但前提是另一列的值是特定的。
比如我的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