2017-09-19 4 views
1

J'ai déjà posé ma question mais elle n'était pas assez précise dans sa description. Les gens intelligents dans ce forum ont déjà proposé des solutions, mais j'ai oublié (désolé) de préciser que s'il y avait des zéros dans les colonnes pertinentes, ils devraient être conservés.Comment (avec apply) pour sélectionner et copier des colonnes spécifiques dans une Dataframe selon l'index ou une autre colonne

Bonjour J'ai un dataframe comme ci-dessous

   2014 2015 2016 2017 2018 2019 

     2014 10 20 30 40 0  5 
     2015 0  0 200 0 100  0  
     2016 0  0 200 140 35 10  
     2017 0  0  0  20  0 12  

je dois avoir un résultat comme celui-ci:

yearStart yearStart+1 yearStart+2 yearStart+3 yearStart+4 
0  10   20   30   40   0 
1  0   200    0   100   0  
2  200   140   35   10   0 
3  20   0    12   0   0 

L'idée est de sélectionner dans chaque ligne, les colonnes entre deux dates:

index et l'index + delta, avec un delta un paramètre (dans cet exemple 4) pour les mettre dans une trame de données.

Avec iterrows(), cela prend trop de temps.

J'ai essayé avec

df1 = df.apply(lambda x: pd.Series(x[x.keys()>=x.index],1)).fillna(0).astype(int) 

mais il ne fonctionne pas:

TypeError: ('Index(...) must be called with a collection of some kind, 
1 was passed', 'occurred at index 2014') 

Merci

+0

double possible de [ dataframe panda: comment copier certaines colonnes dans d'autres en fonction d'une valeur dans la ligne] (https://stackoverflow.com/questions/46283564/panda-dataframe-how-to-copy-some-columns-in-others-according-to-a-value-in-the – GPhilo

+0

Vous devez éditer votre première question en précisant vos besoins, ne pas ouvrir une nouvelle question essentiellement identique à la première. – GPhilo

+1

désolé mais je suis un débutant dans ce forum. Je m'excuse pour ma maladresse. En tout cas merci. Le fait que certains zéros doivent être conservés m'a donné des raisons de penser que c'était un cas différent. – phil

Répondre

0

Une des façons serait

In [1010]: def yearmove(x): 
     ...:  idx = x.index.astype(int) 
     ...:  idx = idx - x.name 
     ...:  mask = idx >= 0 
     ...:  idx = 'yearStart' + idx.astype(str) 
     ...:  return pd.Series(x.values[mask], index=idx[mask]) 
     ...: 

In [1011]: df.apply(yearmove, 1).fillna(0).astype(int) 
Out[1011]: 
     yearStart0 yearStart1 yearStart2 yearStart3 yearStart4 yearStart5 
2014   10   20   30   40   0   5 
2015   0   200   0   100   0   0 
2016   200   140   35   10   0   0 
2017   20   0   12   0   0   0 
+0

Thak vous. ça fonctionne parfaitement. Si j'ai besoin d'avoir une condition sur la durée des fenêtres temporelles, j'écris mask = (idx> = 0 et idx <= delta) mais il répond ValueError: ('La valeur de vérité d'un tableau avec plus d'un l'élément est ambigu.Utilisez a.any() ou a.all() ',' s'est produit à l'index 2015 ') – phil

+0

Je réalise mon erreur:' et 'au lieu de' & 'mais il y a une erreur de type entre' int 'et 'int64' avec l'opérateur '&' ... Je suis en train de le suivre – phil