2 votes

Découpage d'un cadre de données et ajout de valeurs basées sur différents découpages

J'ai un cadre de données avec une colonne représentant les phases ('A', 'B', et 'C'). Je dois découper le cadre de données pour n'avoir que la colonne 'A', la diviser par 2 et ajouter la valeur à l'autre colonne.

En voici un exemple :

import pandas as pd

data = {'time': [1,2,1,2,1,2,],
        'phase': ['A', 'A', 'B', 'B', 'C', 'C' ],
        'value': [2, 3, 4, 5, 6, 7]}
df = pd.DataFrame(data)
print(df)

   time phase  value
0     1     A      2
1     2     A      3
2     1     B      4
3     2     B      5
4     1     C      6
5     2     C      7

slice_A = df.loc[df['phase']== 'A', 'value'] /2 
print(slice_A)

0    1.0
1    1.5
Name: value, dtype: float64

df.loc[df['phase']=='B', 'value'] += slice_A

df
time    phase   value
0   1   A   2.0
1   2   A   3.0
2   1   B   NaN
3   2   B   NaN
4   1   C   6.0
5   2   C   7.0

Je comprends que c'est parce que l'index de slice_A n'est pas la même chose que :

df.loc[df['phase']=='B', 'value']

J'ai essayé de réinitialiser la série avec l'index du cadre de données découpé. J'ai également essayé de travailler avec des cadres de données au lieu de séries, mais je n'ai pas réussi à le faire. Mais j'obtiens toujours des valeurs Nan.

2voto

Corralien Points 6849

Convertissez votre série en tableau numpy pour éviter l'alignement des index :

df.loc[df['phase']=='B', 'value'] += slice_A.to_numpy()
print(df)

# Output
   time phase  value
0     1     A    2.0
1     2     A    3.0
2     1     B    5.0
3     2     B    6.5
4     1     C    6.0
5     2     C    7.0

Il est évident que cela fonctionne parce que vous avez autant de A que de B. Vous pouvez ajouter à B :

  • une valeur scalaire comme 3
  • un tableau d'un élément [3]
  • un tableau de la même forme (ici (2,) )
  • une série ayant le même indice

0voto

S Rawson Points 166

Si vous souhaitez appliquer cette méthode à toutes les lignes (et pas seulement aux lignes "B"), vous pouvez utiliser la méthode suivante, qui fonctionne également pour un nombre donné de lignes "A", par exemple 3 de chaque groupe :

df.value.add(df.groupby("phase").cumcount()
             .map(df[df.phase.eq("A")].value.div(2).reset_index(drop=True)))\
    .sub(df.phase.eq("A").div(2))

#Out[]: 
#0    2.5
#1    4.0
#2    5.0
#3    6.5
#4    7.0
#5    8.5
#dtype: float64

Il calcule le nombre cumulé et le met en correspondance avec les valeurs "A" divisées par deux. L'addition est ensuite à nouveau soustraite de "A".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X