2017-08-23 1 views
-1

J'ai un pandas géants dfconcaténer une trame de données avec un cyclique déplacé sous-ensemble de ses colonnes

id v1  v2 
1 20.1 30.1 
2 32.0 40 
3 11.0 12.012 

Je veux ajouter 2 autres colonnes telles que mon dataframe ressemble à:

id v1  v2  v1_new v2_new 
1 20.1 30.1 32.0  40 
2 32.0 40  11.0  12.012 
3 11.0 12.012 20.1  30.1 

-à-dire en ajoutant la lignes consécutives suivantes en tant que colonne dans la ligne précédente et pour la dernière ligne, ajoutez des valeurs de remplissage de colonne de la première ligne.

Y a-t-il un moyen de le faire?

Répondre

2

Utilisez np.roll

In [793]: df.assign(v1_new=np.roll(df.v1, -1), v2_new=np.roll(df.v2, -1)) 
Out[793]: 
    id v1  v2 v1_new v2_new 
0 1 20.1 30.100 32.0 40.000 
1 2 32.0 40.000 11.0 12.012 
2 3 11.0 12.012 20.1 30.100 
+0

Nice ... quelque chose de nouveau. –

1

Pour référence, vous pouvez mettre en œuvre une version générique de np.roll utilisant df.iloc et pd.concat:

In [521]: pd.concat([df1, df1.iloc[:, -2:].transform(np.roll, shift=-1).add_suffix('_new')], 1) 
Out[521]: 
    id v1  v2 v1_new v2_new 
0 1 20.1 30.100 32.0 40.000 
1 2 32.0 40.000 11.0 12.012 
2 3 11.0 12.012 20.1 30.100 

Ceci est une version plus générale de John Galt's solution, et fonctionne si vous voulez rouler un nombre arbitraire de colonnes.