Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据True/False“在数据帧中添加后续值;套;_Python_Pandas - Fatal编程技术网

Python 根据True/False“在数据帧中添加后续值;套;

Python 根据True/False“在数据帧中添加后续值;套;,python,pandas,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

我有这样一个数据帧:

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
条目有一个值,然后在
df.complete
中至少有一个
False
。它应该是
True
num加上之后的每个
False
num之和,直到下一个
True
再次出现

在本例中,它将是两个总和的列表:

[(5.2 + 1.3 + 0.33), (0.74 + 0.5)] 
所以最终的结果是

[6.83, 1.24]

什么是生成最终列表的python方法?

一种方法是:

In [28]: df.groupby(df.complete.cumsum()).sum()[1:].num.values
Out[28]: array([ 6.83,  1.24])

一种方法是:

In [28]: df.groupby(df.complete.cumsum()).sum()[1:].num.values
Out[28]: array([ 6.83,  1.24])
我会:

# 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]
我会:

# 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]
也可以

df.groupby(df[df.complete.cumsum().duplicated(keep=False)].complete.cumsum()).num.sum()

说明:

df.complete.cumsum()
为您提供一个
系列
,您希望将具有相同数字(例如1和2)的行相加

然后,
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()
,并将其与过滤后的数据帧分组即可


编辑:

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()
我相信这适用于每种情况:)

也可以

df.groupby(df[df.complete.cumsum().duplicated(keep=False)].complete.cumsum()).num.sum()

说明:

df.complete.cumsum()
为您提供一个
系列
,您希望将具有相同数字(例如1和2)的行相加

然后,
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()
,并将其与过滤后的数据帧分组即可


编辑:

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()

这适用于我认为的每种情况:)

如果第3行和第4行之间有另一个
True 0.5
行,那么输出会是什么?输出应该忽略它(后面没有
False
值),还是只在最终列表中包含值0.5?输出应该忽略后面没有
False
True
。如果在第3行和第4行之间有另一行
True 0.5
行,输出会是什么?输出应该忽略它(后面没有
False
值),还是应该在最终列表中只包含值0.5?输出应该忽略后面没有
False
True
。这将忽略第一组,即使df以True开头。此外,请参见评论中OP对我的问题的回答。这将忽略第一组,即使df以True开头。另外,请参见评论中OP对我问题的回答。谢谢,这是非常聪明和有用的!尽管我之前没有指定仅真值不应该有和,但我现在已经编辑了这个问题。@jua kali更新了答案。让我知道这是否有帮助。谢谢更新。我只想说明一下,您最初的答案是
df['group']=df['complete'].cumsum()
然后
df.groupby('group')['num'].sum()[1:].tolist()
。当每个
True
都需要一个和时,它就起作用了,这帮我解决了另一个问题。我只是想把它放在这里,以防将来我需要再次提到这个问题。:)谢谢,这是非常聪明和有益的!尽管我之前没有指定仅真值不应该有和,但我现在已经编辑了这个问题。@jua kali更新了答案。让我知道这是否有帮助。谢谢更新。我只想说明一下,您最初的答案是
df['group']=df['complete'].cumsum()
然后
df.groupby('group')['num'].sum()[1:].tolist()
。当每个
True
都需要一个和时,它就起作用了,这帮我解决了另一个问题。我只是想把它放在这里,以防将来我需要再次提到这个问题。:)聪明的但是如果df以几个假值开始,则将包括第一个值。聪明。但如果df以几个假值开始,则将包括第一个值。