Sum*_*dke 2 python numpy pandas
我有一个像这样的数据框
EndDate
2007-10-31 0
2007-11-30 -0.03384464
2007-12-31 -0.0336299
2008-01-31 -0.009448923
2008-02-29 0
2008-03-31 -0.05744962
2008-04-30 -0.0386942
2008-05-31 0
2008-06-30 -0.03624518
2008-07-31 -0.005286455
2008-08-31 0
2008-09-30 -0.1619864
2008-10-31 -0.2862122
2008-11-30 -0.2942793
2008-12-31 -0.2913253
Run Code Online (Sandbox Code Playgroud)
现在我想在每次出现 0 后分割数据帧。因此新的数据帧应该如下所示:
Dataframe 1:
2007-11-30 -0.03384464
2007-12-31 -0.0336299
2008-01-31 -0.009448923
2008-02-29 0
Dataframe 2:
2008-03-31 -0.05744962
2008-04-30 -0.0386942
2008-05-31 0
Dataframe 3:
2008-06-30 -0.03624518
2008-07-31 -0.005286455
2008-08-31 0
Dataframe 4:
2008-09-30 -0.1619864
2008-10-31 -0.2862122
2008-11-30 -0.2942793
2008-12-31 -0.2913253
Run Code Online (Sandbox Code Playgroud)
我不知道如何做到这一点。我可以迭代每一行寻找 0 但我认为应该有更好的方法。
首先,您可以通过将值列与零进行比较,然后计算这些布尔值的累积和来创建组编号。
df['group_no'] = (df.val == 0).cumsum()
>>> df.head(6)
EndDate val group_no
0 2007-10-31 0.000000 1
1 2007-11-30 -0.033845 1
2 2007-12-31 -0.033630 1
3 2008-01-31 -0.009449 1
4 2008-02-29 0.000000 2
5 2008-03-31 -0.057450 2
Run Code Online (Sandbox Code Playgroud)
接下来,您可以使用字典理解来loc选择相关的group_no数据帧。iat为了获取最后一个组编号,我使用基于位置的索引获取最后一个值。
d = {i: df.loc[df.group_no == i, ['EndDate', 'val']]
for i in range(1, df.group_no.iat[-1])}
>>> d
{1: EndDate val
0 2007-10-31 0.000000
1 2007-11-30 -0.033845
2 2007-12-31 -0.033630
3 2008-01-31 -0.009449,
2: EndDate val
4 2008-02-29 0.000000
5 2008-03-31 -0.057450
6 2008-04-30 -0.038694,
3: EndDate val
7 2008-05-31 0.000000
8 2008-06-30 -0.036245
9 2008-07-31 -0.005286}
Run Code Online (Sandbox Code Playgroud)
编辑 正如 @DSM 所建议的,根据具有 15k 行的示例数据帧,使用 groupby 似乎快了大约 6 倍。
d = {n: df2.ix[rows]
for n, rows in enumerate(df2.groupby('group_no').groups)}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3300 次 |
| 最近记录: |