[英]Group by consecutive index numbers
I was wondering if there is a way to groupby consecutive index numbers and move the groups in different columns. 我想知道是否有一种方法可以对连续的索引号进行分组并将组移动到不同的列中。 Here is an example of the DataFrame I'm using:
这是我正在使用的DataFrame的示例:
0
0 19218.965703
1 19247.621650
2 19232.651322
9 19279.216956
10 19330.087371
11 19304.316973
And my idea is to gruoup by sequential index numbers and get something like this: 我的想法是按顺序索引号进行组合,得到如下所示的内容:
0 1
0 19218.965703 19279.216956
1 19247.621650 19330.087371
2 19232.651322 19304.316973
Ive been trying to split my data by blocks of 3 and then groupby but I was looking more about something that can be used to group and rearrange sequential index numbers. 我一直试图将数据分成3个块,然后再进行groupby划分,但是我一直在寻找更多可用于对顺序索引号进行分组和重新排列的东西。 Thank you!
谢谢!
Here is one way: 这是一种方法:
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)
0 1
0 19218.965703 19279.216956
1 19247.621650 19330.087371
2 19232.651322 19304.316973
This is a groupby
+ pivot_table
这是一个
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))
1 2
key
0 19218.965703 19279.216956
1 19247.621650 19330.087371
2 19232.651322 19304.316973
pandas.Series
with a new pandas.MultiIndex
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
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
One way from pandas
groupby
从
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
I think that you have assumed that the number of observations within each consecutive group will be the same. 我认为您已假设每个连续组中的观察次数相同。 My approach is:
我的方法是:
Prepare the data: 准备数据:
import pandas as pd
import numpy as np
df = pd.DataFrame(data ={'data':[19218.965703 ,19247.621650 ,19232.651322 ,19279.216956 ,19330.087371 ,19304.316973]}, index = [0,1,2,9,10,11] )
And the solution: 解决方法:
df['Group'] = (df.index.to_series()-np.arange(df.shape[0])).rank(method='dense')
df.reset_index(inplace=True)
df['Observations'] = df.groupby(['Group'])['index'].rank()
df.pivot(index='Observations',columns='Group', values='data')
Which returns: 哪个返回:
Group 1.0 2.0
Observations
1.0 19218.965703 19279.216956
2.0 19247.621650 19330.087371
3.0 19232.651322 19304.316973
My way: 我的方式:
df['groups']=list(df.reset_index()['index']-range(0,len(df)))
pd.concat([df[df['groups']==i][['0']].reset_index(drop=True) for i in df['groups'].unique()],axis=1)
0 0
0 19218.965703 19279.216956
1 19247.621650 19330.087371
2 19232.651322 19304.316973
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.