根据True / False“集合”在熊猫数据框中添加后续值

时间:2018-07-21 10:45:37

标签: python pandas

我有一个这样的数据框:

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方法是什么?

3 个答案:

答案 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])