按连续索引号分组

Giu*_*ppe 26 python group-by numpy pandas

我想知道是否有一种方法可以对连续的索引号进行分组并将组移动到不同的列中。这是我正在使用的DataFrame的示例:

                 0
0     19218.965703
1     19247.621650
2     19232.651322
9     19279.216956
10    19330.087371
11    19304.316973
Run Code Online (Sandbox Code Playgroud)

我的想法是按顺序索引号进行组合,得到如下所示的内容:

                 0             1
0     19218.965703  19279.216956    
1     19247.621650  19330.087371
2     19232.651322  19304.316973
Run Code Online (Sandbox Code Playgroud)

我一直试图将数据分成3个块,然后再进行groupby划分,但是我一直在寻找更多可用于对顺序索引号进行分组和重新排列的东西。谢谢!

ank*_*_91 18

这是一种方法:

from more_itertools import consecutive_groups
final=pd.concat([df.loc[i].reset_index(drop=True) 
                    for i in consecutive_groups(df.index)],axis=1)
final.columns=range(len(final.columns))
print(final)
Run Code Online (Sandbox Code Playgroud)
              0             1
0  19218.965703  19279.216956
1  19247.621650  19330.087371
2  19232.651322  19304.316973
Run Code Online (Sandbox Code Playgroud)


use*_*203 8

这是groupby+pivot_table


m = df.index.to_series().diff().ne(1).cumsum()

(df.assign(key=df.groupby(m).cumcount())
    .pivot_table(index='key', columns=m, values=0))
Run Code Online (Sandbox Code Playgroud)

                1             2
key
0    19218.965703  19279.216956
1    19247.621650  19330.087371
2    19232.651322  19304.316973
Run Code Online (Sandbox Code Playgroud)


piR*_*red 7

用新的创建pandas.Series新的pandas.MultiIndex

a = pd.factorize(df.index - np.arange(len(df)))[0]
b = df.groupby(a).cumcount()

pd.Series(df['0'].to_numpy(), [b, a]).unstack()

              0             1
0  19218.965703  19279.216956
1  19247.621650  19330.087371
2  19232.651322  19304.316973
Run Code Online (Sandbox Code Playgroud)

类似,但更多

a = pd.factorize(df.index - np.arange(len(df)))[0]
b = df.groupby(a).cumcount()

c = np.empty((b.max() + 1, a.max() + 1), float)
c.fill(np.nan)
c[b, a] = np.ravel(df)
pd.DataFrame(c)

              0             1
0  19218.965703  19279.216956
1  19247.621650  19330.087371
2  19232.651322  19304.316973
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 6

一种方式 pandas groupby

s=df.index.to_series().diff().ne(1).cumsum()
pd.concat({x: y.reset_index(drop=True) for x, y in df['0'].groupby(s)}, axis=1)

Out[786]: 
              1             2
0  19218.965703  19279.216956
1  19247.621650  19330.087371
2  19232.651322  19304.316973
Run Code Online (Sandbox Code Playgroud)