Je voulais générer une sorte de cycle pour mon dataFrame. Un cycle dans l'exemple ci-dessous a une longueur de 4. La dernière colonne est à quoi doit ressembler, les autres sont des tentatives en mon nom.

Mon code actuel ressemble à ceci:

import pandas as pd
import numpy as np

l = list(np.linspace(0,10,12))
data = [
        ('time',l),
         ('A',[0,5,0.6,-4.8,-0.3,4.9,0.2,-4.7,0.5,5,0.1,-4.6]),
         ('B',[ 0,300,20,-280,-25,290,30,-270,40,300,-10,-260]),
         ]
df = pd.DataFrame.from_dict(dict(data))
length = len(df)
df.loc[0,'cycle']=1
df['cycle'] = length/4 +df.loc[0,'cycle']
i = 0
for i in range(0,length):
    df.loc[i,'new_cycle']=i+1
df['want_cycle']=   [1,1,1,1,2,2,2,2,3,3,3,3]  
print(length)
print(df)

J'ai besoin d'une condition if dans le code, aussi, seulement l'augmentation de la valeur de df ['new_cycle'] si le compteur d'index par exemple 4. Mais jusqu'à présent, je n'ai pas réussi à trouver un moyen approprié de mettre en œuvre de telles conditions.

0
sulphur 7 mars 2019 à 18:26

2 réponses

Meilleure réponse

Essayez ceci avec l'index de plage par défaut, car votre index de ligne de trame de données est une plage commençant par 0, l'index par défaut d'une trame de données, vous pouvez utiliser la division du plancher pour calculer votre cycle:

df['cycle'] = df.index//4 + 1

Production:

         time    A    B  cycle
0    0.000000  0.0    0      1
1    0.909091  5.0  300      1
2    1.818182  0.6   20      1
3    2.727273 -4.8 -280      1
4    3.636364 -0.3  -25      2
5    4.545455  4.9  290      2
6    5.454545  0.2   30      2
7    6.363636 -4.7 -270      2
8    7.272727  0.5   40      3
9    8.181818  5.0  300      3
10   9.090909  0.1  -10      3
11  10.000000 -4.6 -260      3

Maintenant, si votre index de trame de données n'est pas la valeur par défaut, vous pouvez utiliser quelque chose comme ceci:

df['cycle'] = [df.index.get_loc(i) // 4 + 1 for i in  df.index]
0
Scott Boston 7 mars 2019 à 15:44

J'ai ajouté une seule chose pour vous, une nouvelle variable appelée new_cycle qui gardera le compte que vous recherchez.

Dans la boucle for, nous vérifions si i est divisible par 4 sans reste, si c'est le cas, nous ajoutons 1 à la nouvelle variable et remplissons le bloc de données avec cette valeur de la même manière Tu l'as fait.

import pandas as pd
import numpy as np

l = list(np.linspace(0,10,12))
data = [
        ('time',l),
         ('A',[0,5,0.6,-4.8,-0.3,4.9,0.2,-4.7,0.5,5,0.1,-4.6]),
         ('B',[ 0,300,20,-280,-25,290,30,-270,40,300,-10,-260]),
         ]
df = pd.DataFrame.from_dict(dict(data))
length = len(df)
df.loc[0,'cycle']=1
df['cycle'] = length/4 +df.loc[0,'cycle']
new_cycle = 0
for i in range(0,length):
    if i % 4 == 0:
        new_cycle += 1
    df.loc[i,'new_cycle']= new_cycle
df['want_cycle'] = [1,1,1,1,2,2,2,2,3,3,3,3]  
print(length)
print(df) 
0
RockHardRacoon 7 mars 2019 à 16:09