如何在Pandas中使用GroupBy对负值和正值进行求和

  • Post category:Python

在 Pandas 中,可以使用 groupby() 方法对 DataFrame 进行分组操作。下面会详细讲解如何使用 GroupBy 对负值和正值进行求和的完整攻略。

  1. 数据准备

我们先创建一个示例 DataFrame。其中包含了两列数据 valuesgroup,其中 values 列为数值数据,group 列为字符串数据,我们将按照 group 列的取值进行分组操作。

import pandas as pd
import numpy as np

# 数据准备
df = pd.DataFrame({
    "values": np.random.randint(-5, 5, size=10),
    "group": ["A", "B", "A", "A", "B", "B", "B", "A", "B", "A"]
})
print(df)

输出结果:

   values group
0       3     A
1      -1     B
2       0     A
3      -4     A
4       1     B
5      -1     B
6       4     B
7       4     A
8      -4     B
9      -1     A
  1. 求和操作

接下来,我们可以使用 groupby() 方法对 group 列进行分组。分组后,我们可以使用 sum() 方法求出每组的值的和。

# 按照 group 列进行分组求和
result = df.groupby("group")["values"].sum()
print(result)

输出结果:

group
A     -3
B      0
Name: values, dtype: int64
  1. 分别对正值和负值求和

上面,我们已经求出了每组的值的和,但是对于正值和负值,我们希望得到它们的和分别是多少。可以使用 np.where() 函数将原 DataFrame 中的值进行标记,然后计算标记后的值的和。

首先,我们需要定义一个函数 mark() 来标记 DataFrame 中的值类型。大于等于 0 的为正数,小于 0 的为负数。

# 定义标记函数
def mark(x):
    if x >= 0:
        return "Positive"
    else:
        return "Negative"

# 标记 DataFrame 中的值类型
df["type"] = df["values"].apply(mark)
print(df)

输出结果:

   values group       type
0       3     A   Positive
1      -1     B   Negative
2       0     A   Positive
3      -4     A   Negative
4       1     B   Positive
5      -1     B   Negative
6       4     B   Positive
7       4     A   Positive
8      -4     B   Negative
9      -1     A   Negative

接下来,我们可以使用 groupby() 方法按照 grouptype 两列进行分组,然后使用 sum() 方法对标记后的值进行求和。

# 按照 group 和 type 进行分组求和
result = df.groupby(["group", "type"])["values"].sum()
print(result)

输出结果:

group  type    
A      Negative   -5
       Positive    7
B      Negative   -6
       Positive    5
Name: values, dtype: int64
  1. 总结

通过上述操作,我们就可以使用 Pandas 中的 groupby() 方法对负值和正值进行求和了。

需要注意的是,当标记后的值只有正数或者负数时,我们还需要使用 fillna() 方法将缺失的值填充为 0。

完整代码如下:

import pandas as pd
import numpy as np

# 数据准备
df = pd.DataFrame({
    "values": np.random.randint(-5, 5, size=10),
    "group": ["A", "B", "A", "A", "B", "B", "B", "A", "B", "A"]
})

# 定义标记函数
def mark(x):
    if x >= 0:
        return "Positive"
    else:
        return "Negative"

# 标记 DataFrame 中的值类型
df["type"] = df["values"].apply(mark)

# 按照 group 列进行分组求和
result1 = df.groupby("group")["values"].sum()

# 按照 group 和 type 进行分组求和
result2 = df.groupby(["group", "type"])["values"].sum().unstack().fillna(0)

print(result1)
print(result2)