python - تجميع حسب أرقام الفهرس المتتالية




pandas numpy (4)

كنت أتساءل ما إذا كان هناك طريقة لتجميع أرقام الفهرس المتتالية ونقل المجموعات في أعمدة مختلفة. فيما يلي مثال على DataFrame الذي أستخدمه:

                 0
0     19218.965703
1     19247.621650
2     19232.651322
9     19279.216956
10    19330.087371
11    19304.316973

وفكرتي هي أن أخدع بأرقام فهرس متسلسلة والحصول على شيء مثل هذا:

                 0             1
0     19218.965703  19279.216956    
1     19247.621650  19330.087371
2     19232.651322  19304.316973

لقد حاولت تقسيم بياناتي بواسطة كتل 3 ثم تجميع ، لكنني كنت أبحث عن المزيد حول شيء يمكن استخدامه لتجميع وإعادة ترتيب أرقام الفهرس المتسلسلة. شكرا لك!


قم بإنشاء 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

مماثلة ولكن مع المزيد من Numpy

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

أعتقد أنك قد افترضت أن عدد الملاحظات داخل كل مجموعة متتالية سيكون هو نفسه. مقاربي هي:

تحضير البيانات:

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] )

والحل:

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')

الذي يعود:

Group                  1.0           2.0
Observations                            
1.0           19218.965703  19279.216956
2.0           19247.621650  19330.087371
3.0           19232.651322  19304.316973

طريقة واحدة من 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

طريقى:

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






group-by