2017-09-21 6 views
1

J'ai un ensemble de données qui ressemble à ceci:données de fenêtres coulissantes avec Pandas dataframe

df = DataFrame(dict(month = [1,2,3,4,5,6], a = [2,4,2,4,2,4], b = [3,5,6,3,4,6])) 

enter image description here

ce que je veux est une fonction qui peut prendre une taille de fenêtre en entrée et me donner quelque chose comme ceci:

fonction

: def make_sliding_df(data, size)

  1. Si je fais make_sliding_df(df, 1) la sortie devrait être une trame de données comme ceci:

enter image description here

  1. Si je make_sliding_df(df, 2) la sortie devrait être une trame de données comme ceci:

enter image description here J'ai essayé pas mal de choses mais aucune ne m'a aidé jusqu'ici, toute aide serait appréciée. (J'ai vérifié quelques autres questions similaires, mais aucune n'a aidé)

Répondre

2

est ici un moyen utilisant shift, applymap et reduce

In [2007]: def make_sliding(df, N): 
     ...:  dfs = [df.shift(-i).applymap(lambda x: [x]) for i in range(0, N+1)] 
     ...:  return reduce(lambda x, y: x.add(y), dfs) 
     ...: 

In [2008]: make_sliding(df, 1) 
Out[2008]: 
      a   b  month 
0 [2, 4.0] [3, 5.0] [1, 2.0] 
1 [4, 2.0] [5, 6.0] [2, 3.0] 
2 [2, 4.0] [6, 3.0] [3, 4.0] 
3 [4, 2.0] [3, 4.0] [4, 5.0] 
4 [2, 4.0] [4, 6.0] [5, 6.0] 
5 [4, nan] [6, nan] [6, nan] 

In [2009]: make_sliding(df, 2) 
Out[2009]: 
       a    b   month 
0 [2, 4.0, 2.0] [3, 5.0, 6.0] [1, 2.0, 3.0] 
1 [4, 2.0, 4.0] [5, 6.0, 3.0] [2, 3.0, 4.0] 
2 [2, 4.0, 2.0] [6, 3.0, 4.0] [3, 4.0, 5.0] 
3 [4, 2.0, 4.0] [3, 4.0, 6.0] [4, 5.0, 6.0] 
4 [2, 4.0, nan] [4, 6.0, nan] [5, 6.0, nan] 
5 [4, nan, nan] [6, nan, nan] [6, nan, nan] 
0

Ce en utilisant numpy, cela peut sembler laid, mais il est mon premier essai avec numpy ...

def make_sliding_df(df,step=1,width=2): 
    l=[] 
    for x in df.columns: 
     a=df[x] 
     a=np.array(a) 
     b=np.append(a,[np.nan]*(width-1)) 
     l.append((b[(np.arange(width)[None, :] + step*np.arange(len(a))[:, None])]).tolist()) 
    newdf=pd.DataFrame(data=l).T 
    newdf.columns=df.columns 
    return(newdf) 

make_sliding_df(df,step=1,width=2) 
Out[157]: 
      a   b  month 
0 [2.0, 4.0] [3.0, 5.0] [1.0, 2.0] 
1 [4.0, 2.0] [5.0, 6.0] [2.0, 3.0] 
2 [2.0, 4.0] [6.0, 3.0] [3.0, 4.0] 
3 [4.0, 2.0] [3.0, 4.0] [4.0, 5.0] 
4 [2.0, 4.0] [4.0, 6.0] [5.0, 6.0] 
5 [4.0, nan] [6.0, nan] [6.0, nan] 

make_sliding_df(df,step=1,width=3) 
Out[158]: 
       a    b   month 
0 [2.0, 4.0, 2.0] [3.0, 5.0, 6.0] [1.0, 2.0, 3.0] 
1 [4.0, 2.0, 4.0] [5.0, 6.0, 3.0] [2.0, 3.0, 4.0] 
2 [2.0, 4.0, 2.0] [6.0, 3.0, 4.0] [3.0, 4.0, 5.0] 
3 [4.0, 2.0, 4.0] [3.0, 4.0, 6.0] [4.0, 5.0, 6.0] 
4 [2.0, 4.0, nan] [4.0, 6.0, nan] [5.0, 6.0, nan] 
5 [4.0, nan, nan] [6.0, nan, nan] [6.0, nan, nan]