【发布时间】:2015-10-07 14:25:13
【问题描述】:
我有一个数据框,如果下一行的索引大于 1 加上前一个索引(例如,如果它从索引 73 到 75 或更高),我想将它们拆分为单独的数据框。我怎样才能做到这一点?
【问题讨论】:
标签: python pandas dataframe pandas-groupby
我有一个数据框,如果下一行的索引大于 1 加上前一个索引(例如,如果它从索引 73 到 75 或更高),我想将它们拆分为单独的数据框。我怎样才能做到这一点?
【问题讨论】:
标签: python pandas dataframe pandas-groupby
这可以使用通常的 compare-cumsum-groupby 模式的变体来完成,仅应用于索引而不是列。 (至少在索引正常的情况下。)例如:
>>> df = pd.DataFrame({"A": list("abcde")}, index=[1,2,4,5,8])
>>> df
A
1 a
2 b
4 c
5 d
8 e
>>> grouped = df.groupby((df.index.to_series().diff() > 1).cumsum())
>>> for group_id, group in grouped:
... print("group id:", group_id)
... print(group)
... print()
...
group id: 0
A
1 a
2 b
group id: 1
A
4 c
5 d
group id: 2
A
8 e
您可以直接使用frames = [g for k,g in grouped] 或其他方式获取框架。
这是可行的,因为我们可以使用diff 来比较索引中的跳跃(在转换为系列之后),然后如果我们对差值大于 1 的一些布尔值进行累积,我们会得到一个增长每个组的索引:
>>> df.index.to_series().diff()
1 NaN
2 1
4 2
5 1
8 3
dtype: float64
>>> df.index.to_series().diff() > 1
1 False
2 False
4 True
5 False
8 True
dtype: bool
>>> (df.index.to_series().diff() > 1).cumsum()
1 0
2 0
4 1
5 1
8 2
dtype: int64
【讨论】: