在 Pandas 中,可以使用 groupby()
方法对 DataFrame 进行分组操作。下面会详细讲解如何使用 GroupBy 对负值和正值进行求和的完整攻略。
- 数据准备
我们先创建一个示例 DataFrame。其中包含了两列数据 values
和 group
,其中 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
- 求和操作
接下来,我们可以使用 groupby()
方法对 group
列进行分组。分组后,我们可以使用 sum()
方法求出每组的值的和。
# 按照 group 列进行分组求和
result = df.groupby("group")["values"].sum()
print(result)
输出结果:
group
A -3
B 0
Name: values, dtype: int64
- 分别对正值和负值求和
上面,我们已经求出了每组的值的和,但是对于正值和负值,我们希望得到它们的和分别是多少。可以使用 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()
方法按照 group
和 type
两列进行分组,然后使用 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
- 总结
通过上述操作,我们就可以使用 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)