我想根据索引拆分下面的DF_input。这来自下面的DF,如何获得:
measurement value
0 0 13
1 1 3
2 2 4
0 0 8
1 1 12
2 2 34
3 5 54
DF_output1
measurement value
0 0 13
1 1 3
2 2 4
DF_output2
measurement value
0 0 8
1 1 12
2 2 34
3 5 54
我做的是以下内容:`
df_input.reset_index(inplace=True)
shifted = df_dataset['index'].shift()
m = shifted.diff(-1).ne(0.000000)
a = m.cumsum()
aa = df_dataset.groupby([df_dataset.uuid,a])
for k, gp in aa:
print(gp)
我做错了什么?任何帮助请非常感谢。 最诚挚的问候,卡罗
答案 0 :(得分:1)
您可以使用:
a = df.index.to_series().eq(0).cumsum()
print (a)
0 1
1 1
2 1
0 2
1 2
2 2
3 2
dtype: int32
aa = df.groupby(a)
for k, gp in aa:
print(gp)
答案 1 :(得分:1)
使用groupby
将索引划分为增加子序列的单独数据帧:
for _, g in df.groupby((df.index.to_series().diff().fillna(1) < 0).cumsum()):
print(g, '\n')
measurement value
0 0 13
1 1 3
2 2 4
measurement value
0 0 8
1 1 12
2 2 34
3 5 54
这个解决方案稍微灵活一些,因为它没有根据它们是以0
开头来定义组,而是在索引中找到增加的子序列。
答案 2 :(得分:1)
在
等索引上使用groupby
In [4266]: for n, g in df.groupby((df.index == 0).cumsum()):
...: print g
...:
measurement value
0 0 13
1 1 3
2 2 4
measurement value
0 0 8
1 1 12
2 2 34
3 5 54
最好存储它有dict。
In [4264]: {n: g for n, g in df.groupby((df.index == 0).cumsum())}
Out[4264]:
{1: measurement value
0 0 13
1 1 3
2 2 4, 2: measurement value
0 0 8
1 1 12
2 2 34
3 5 54}
分区方法的时间
In [4279]: df.shape
Out[4279]: (7000, 3)
In [4280]: %timeit (df.index == 0).cumsum()
1000 loops, best of 3: 118 µs per loop
In [4281]: %timeit df.index.to_series().eq(0).cumsum()
1000 loops, best of 3: 420 µs per loop
In [4282]: %timeit (df.index.to_series().diff().fillna(1) < 0).cumsum()
1000 loops, best of 3: 623 µs per loop
In [4284]: df.shape
Out[4284]: (70000, 4)
In [4285]: %timeit (df.index == 0).cumsum()
1000 loops, best of 3: 328 µs per loop
In [4286]: %timeit df.index.to_series().eq(0).cumsum()
1000 loops, best of 3: 805 µs per loop
In [4287]: %timeit (df.index.to_series().diff().fillna(1) < 0).cumsum()
100 loops, best of 3: 1.42 ms per loop
答案 3 :(得分:1)
这是我的答案:
df_input.reset_index(inplace=True)
shifted = df_dataset['index'].shift()
m = shifted.diff(-1).gt(0.000000)
a = m.cumsum()
aa = df_dataset.groupby([df_dataset.uuid,a])
for k, gp in aa:
print(gp)
答案 4 :(得分:1)
这是我的解决方案......(真的很难想出边框)
df=df.reset_index()
ll=df.loc[df.measurement==0,].index.values.tolist()
for i in range(len(ll)) :
if i<len(ll)-1:
print(df.loc[ll[i]:(ll[i+1]-1)])
else :
print(df.loc[ll[i]:])
index measurement value
0 0 0 13
1 1 1 3
2 2 2 4
index measurement value
3 0 0 8
4 1 1 12
5 2 2 34
6 3 5 54