我有一组数据,分组和年,有10个指标
Group | Year | Index1 | …… | Index10 |
---|---|---|---|---|
A | 2015 | 4 | … | 0 |
A | 2017 | 0 | … | 1 |
B | 2018 | 1 | … | 2 |
C | 2010 | 4 | … | 3 |
C | 2012 | 1 | … | 4 |
C | 2013 | 2 | … | 0 |
我想要先分组再条件求和,分ABC组,分别在2010年之前,2015年之前,2020年之前各个指标的和
只会分组,不会条件求和
index_list = list(df.loc[0].index)
sum = df.groupby(["Group","Year"])[index_list[2:12]].agg(['sum']).reset_index()
该回答引用GPTᴼᴾᴱᴺᴬᴵ
你可以在 groupby 后的 agg 中使用 np.where 条件函数来对符合条件的数据进行求和,以下是一个示例代码:
import numpy as np
# 假设你的数据框名为 df
index_list = list(df.columns[2:]) # 获取所有的指标列名
# 根据 Group 和 Year 进行分组
grouped = df.groupby(['Group', 'Year'])
# 对每组进行条件求和
for group_name, group_df in grouped:
# 按照你的条件进行求和,下面是以 2015 年为例
sum_index1 = np.sum(np.where(group_df['Year'] <= 2015, group_df['Index1'], 0))
sum_index2 = np.sum(np.where(group_df['Year'] <= 2015, group_df['Index2'], 0))
# 其他指标也可以按照相同的方式求和,这里只是示例
print(f"Group: {group_name[0]}, Year: {group_name[1]}, Sum of Index1 before 2015: {sum_index1}, Sum of Index2 before 2015: {sum_index2}")
你可以按照类似的方式对其他年份的指标求和,只需要修改 np.where 中的条件即可。
该回答引用ChatGPT
可以使用 Pandas 的条件筛选功能,配合 groupby 和 agg 函数来进行条件求和操作。以下是一个示例代码:
# 创建一个字典,用于存储每个分组在不同时间段内各个指标的和
grouped_sum = {'Group': [], 'Before_2010': [], 'Before_2015': [], 'Before_2020': []}
# 遍历每个分组
for group_name, group_data in df.groupby('Group'):
# 将分组名称添加到字典中
grouped_sum['Group'].append(group_name)
# 在 2010 年之前的指标求和
before_2010_sum = group_data[group_data['Year'] < 2010][index_list[2:]].sum().tolist()
grouped_sum['Before_2010'].append(before_2010_sum)
# 在 2015 年之前的指标求和
before_2015_sum = group_data[group_data['Year'] < 2015][index_list[2:]].sum().tolist()
grouped_sum['Before_2015'].append(before_2015_sum)
# 在 2020 年之前的指标求和
before_2020_sum = group_data[group_data['Year'] < 2020][index_list[2:]].sum().tolist()
grouped_sum['Before_2020'].append(before_2020_sum)
# 将结果转换成 DataFrame 格式
result_df = pd.DataFrame(grouped_sum)
在上面的代码中,我们首先创建一个空字典 grouped_sum,用于存储每个分组在不同时间段内各个指标的和。然后,我们使用 groupby 函数将数据按照 Group 列分组,接着遍历每个分组,对于每个分组,我们通过条件筛选和 sum 函数来求出在不同时间段内各个指标的和,并将结果添加到 grouped_sum 字典中。最后,我们将 grouped_sum 字典转换成 DataFrame 格式,以便进行后续操作。
这样,您就可以得到一个 DataFrame,其中每行代表一个分组,每列代表一个时间段和一个指标。
不知道你这个问题是否已经解决, 如果还没有解决的话: