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以几个假值开始,则将包括第一个值。