Duplication n lignes dans une trame de données en utilisant l'index de niveau 2?

pierre_j :

J'ai un dataframe de pandas géants que, par exemple, est à la recherche comme celui-ci.

df
            Values
Timestamp
2020-02-01       A
2020-02-02       B
2020-02-03       C

Je voudrais (pour faciliter le traitement à faire par la suite) pour garder une fenêtre de la ligne n et le dupliquer pour chaque horodatage, et la création d'un index de niveau 2 avec int index local.

Avec n = 2, cela donnerait:

df_new
                                Values
Timestamp   2nd_level_index
2020-02-01                0        NaN
                          1          A
2020-02-02                0          A
                          1          B
2020-03-03                0          B
                          1          C

Y at-il sorte de pandas géants intégrés dans la fonction qui me aider à le faire? Une fenêtre de roulement avec une taille fixe (n) semble être le début, mais comment puis-je dupliquer la fenêtre et le stocker pour chaque ligne en utilisant un indice de niveau 2?

Merci d'avance pour votre aide! bests,

Jezréel:

Je pense qu'il n'y a pas intégré dans la méthode de pandas géants.

Solution possible avec des progrès pour générer de roulement tableau 2D:

n = 2
#added Nones for first values of 2d array
x = np.concatenate([[None] * (n-1), df['Values']])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
a = rolling_window(x, n)
print (a)
[[None 'A']
 ['A' 'B']
 ['B' 'C']]

Et puis créer MultiIndexpar MultiIndex.from_productet aplatir les valeurs de tableau par numpy.ravel:

mux = pd.MultiIndex.from_product([df.index, range(n)], names=('times','level1'))
df = pd.DataFrame({'Values': np.ravel(a)}, index=mux)
print (df)
                  Values
times      level1       
2020-02-01 0        None
           1           A
2020-02-02 0           A
           1           B
2020-02-03 0           B
           1           C

Si les valeurs sont des nombres ajouter des valeurs manquantes:

print (df)
            Values
Timestamp         
2020-02-01       1
2020-02-02       2
2020-02-03       3

n = 2
x = np.concatenate([[np.nan] * (n-1), df['Values']])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
a = rolling_window(x, n)
print (a)
[[nan  1.]
 [ 1.  2.]
 [ 2.  3.]]

mux = pd.MultiIndex.from_product([df.index, range(n)], names=('times','level1'))
df = pd.DataFrame({'Values': np.ravel(a)}, index=mux)
print (df)

                   Values
times      level1        
2020-02-01 0          NaN
           1          1.0
2020-02-02 0          1.0
           1          2.0
2020-02-03 0          2.0
           1          3.0

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=387497&siteId=1
conseillé
Classement