Python pandas groupby:在检查点之间对行进行分组
如何在“检查点”之间对所有行进行分组 例如,如果Python pandas groupby:在检查点之间对行进行分组,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,如何在“检查点”之间对所有行进行分组 例如,如果 import pandas as pd df = pd.DataFrame(dict(a=list('abcdefgh'))) checkpoints = [0, 1.5, 6] 如何获取组((0,'a'),(1,'b'))和((2,'c'),(3,'d'),(4,'e'),(5,'f'))和((6,'g'),(7,'h')) 在我的实际用例中,索引是一个日期时间索引,如果解决方案基于逻辑比较而不是索引位置,那就更好了 编辑:检查点并不总是索引
import pandas as pd
df = pd.DataFrame(dict(a=list('abcdefgh')))
checkpoints = [0, 1.5, 6]
如何获取组((0,'a'),(1,'b'))和((2,'c'),(3,'d'),(4,'e'),(5,'f'))和((6,'g'),(7,'h'))
在我的实际用例中,索引是一个日期时间索引,如果解决方案基于逻辑比较而不是索引位置,那就更好了
编辑:检查点并不总是索引的子集一个选项是创建一个标记检查点的新系列,并在该系列上分组:
s = (pd.Series(1, index=checkpoints)
.reindex(df.index, fill_value=0)
.cumsum()
)
[list(v['a'].to_dict().items()) for _,v in df.groupby(s)]
输出:
一个选项是创建一个新系列,标记检查点并在该系列上分组:
s = (pd.Series(1, index=checkpoints)
.reindex(df.index, fill_value=0)
.cumsum()
)
[list(v['a'].to_dict().items()) for _,v in df.groupby(s)]
输出:
让我们使用
cumsum
创建密钥,然后使用groupby
out = df.reset_index().agg(tuple,1).groupby(df.index.isin(checkpoints).cumsum()).agg(list)
Out[55]:
1 [(0, a), (1, b)]
2 [(2, c), (3, d), (4, e), (5, f)]
3 [(6, g), (7, h)]
dtype: object
让我们使用
cumsum
创建密钥,然后使用groupby
out = df.reset_index().agg(tuple,1).groupby(df.index.isin(checkpoints).cumsum()).agg(list)
Out[55]:
1 [(0, a), (1, b)]
2 [(2, c), (3, d), (4, e), (5, f)]
3 [(6, g), (7, h)]
dtype: object
我还不清楚这一点,但在我的实际用例中,我使用的检查点日期不一定在最初的indexIn中,事实上,我明确地说了相反的话。无论如何,如果你对非子集的情况有一个想法,我也很感激,我很抱歉在创建MWE时失败了,我真的有一个多索引,其中多个条目具有相同的日期,我希望组按[“日期范围”,“其他索引级别”],这是您的解决方案不适用于meI的另一个原因我想我已经找到了,使用unstack并使用一些丑陋的方式将检查点捕捉到indexHaven中的关闭日期,对此我并不清楚,但在我的实际用例中,我使用的检查点日期不一定在原始indexIn事实中,我明确地说了相反的话。无论如何,如果你对非子集的情况有一个想法,我也很感激,我很抱歉在创建MWE时失败了,我真的有一个多索引,其中多个条目具有相同的日期,我希望组按[“日期范围”,“其他索引级别”],这是你的解决方案不适用于meI的另一个原因,我想我已经找到了,使用unstack和一些丑陋的方法将检查点捕捉到索引中的结束日期