我有一个这样的数据框:
import pandas as pd
df = pd.DataFrame({ 'num' : [0.43, 5.2, 1.3, 0.33, .74, .5, .2, .12],
'complete' : [False, True, False, False, True, False, True, True]
})
df
complete num
0 False 0.43
1 True 5.20
2 False 1.30
3 False 0.33
4 True 0.74
5 False 0.50
6 True 0.20
7 True 0.12
我想创建一个汇总列表,每个True
条目都有一个值,然后在False
中至少有一个df.complete
。它应该是True
个数字的总和,再加上之后的每个False
个数字,直到下一个True
再次出现。
在此示例中,它将是两个和的列表:
[(5.2 + 1.3 + 0.33), (0.74 + 0.5)]
所以最终结果将是
[6.83, 1.24]
产生最终列表的Python方法是什么?
答案 0 :(得分:2)
我会做的:
# create a group
df['group'] = df['complete'].cumsum()
# find which groups to add
vals = df.group.value_counts()
groups_to_consider = vals[vals > 1].index.tolist()
## add values
df[df['group'].isin(groups_to_consider)].groupby('group')['num'].sum().tolist()
# [6.83, 1.24]
答案 1 :(得分:2)
也可以
df.groupby(df[df.complete.cumsum().duplicated(keep=False)].complete.cumsum()).num.sum()
说明:
df.complete.cumsum()
给您一个Series
,您希望在其中将具有相同数字(例如1 1 1和2 2)的行相加。
0 0
1 1
2 1
3 1
4 2
5 2
6 3
7 4
然后,duplicated(keep=False)
允许您仅使用发生这种情况的行来过滤df
。
df[df.complete.cumsum().duplicated(keep=False)]
complete num
1 True 5.20
2 False 1.30
3 False 0.33
4 True 0.74
5 False 0.50
现在只需再次使用.cumsum()
并对其进行分组,以过滤
1 1
2 1
3 1
4 2
5 2
df.groupby(...).num.sum()
1.0 6.83
2.0 1.24
编辑:
c = df.complete.cumsum()
d = c[c!=0].duplicated(keep=False)
e = df.loc[df.index.isin(d[d].index)].complete.cumsum()
df[df.index.isin(e.index)].groupby(e).num.sum()
这适用于我认为的每种情况:)
答案 2 :(得分:1)
一种方法是:
In [28]: df.groupby(df.complete.cumsum()).sum()[1:].num.values
Out[28]: array([ 6.83, 1.24])