我有以下数据框:
df2 = pd.DataFrame({'season':[1,1,1,2,2,2,3,3],'value' : [-2, 3,1,5,8,6,7,5], 'avail':[3,3,3,8,8,4,25,25],'test2':[4,5,7,8,9,10,11,12]},index=['2020', '2020', '2020','2020', '2020', '2021', '2021', '2021'])
df2.index= pd.to_datetime(df2.index)
df2.index = df2.index.year
print(df2)
avail season test2 value
2020 3 1 4 -2
2020 3 1 5 3
2020 3 1 7 1
2020 8 2 8 5
2020 8 2 9 8
2021 4 2 10 6
2021 25 3 11 7
2021 25 3 12 5
我想每年有效计算“有效”列的总和。这里的难点在于每个赛季只有一个“可用”价值。例如,对于2020年,我想总结3 + 8 = 11。
预期结果(列'sum_avail'):
avail season test2 value sum_avail
2020 3 1 4 -2 11
2020 3 1 5 3 11
2020 3 1 7 1 11
2020 8 2 8 5 11
2020 8 2 9 8 11
2021 4 2 10 6 29
2021 25 3 11 7 29
2021 25 3 12 5 29
答案 0 :(得分:4)
IIUC,transform
+ set
df2.groupby(level=0).avail.transform(lambda x : sum(set(x)))
Out[220]:
2020 11
2020 11
2020 11
2020 11
2020 11
2021 29
2021 29
2021 29
Name: avail, dtype: int64
答案 1 :(得分:3)
您需要groupby
+ transform
+ np.unique
:
df2['sum_avail'] = (
df2.groupby(level=0).avail.transform(lambda x: np.unique(x).sum()))
或者,
df2['sum_avail'] = df2.groupby(level=0).avail.transform('unique').apply(sum)
df2
avail season test2 value sum_avail
2020 3 1 4 -2 11
2020 3 1 5 3 11
2020 3 1 7 1 11
2020 8 2 8 5 11
2020 8 2 9 8 11
2021 4 2 10 6 29
2021 25 3 11 7 29
2021 25 3 12 5 29
答案 2 :(得分:2)
这是一种方法,它采用每个指数/季节对中的第一个值,然后总结它们:
res = df2.groupby([df2.index, 'season'])['avail'].first().sum(level=0)
df2.join(res.rename('sum_avail'))
season value avail test2 sum_avail
2020 1 -2 3 4 11
2020 1 3 3 5 11
2020 1 1 3 7 11
2020 2 5 8 8 11
2020 2 8 8 9 11
2021 2 6 4 10 29
2021 3 7 25 11 29
2021 3 5 25 12 29