1
votes

Ajout d'une nouvelle colonne à la trame de données à l'aide d'une variable existante

J'essaye de créer une nouvelle variable (colonne) dans un dataframe existant.

import pandas as pd

df = pd.read_csv('merge.csv')

Epoch = []

x = 0

while x < 179424:
    if df['Block'][x] < 5:
        Epoch == 1
    elif 4 < df['Block'][x] < 9:
        Epoch == 2
    elif 8 < df['Block'][x] < 13:
        Epoch == 3
    elif 12 < df['Block'][x] < 17:
        Epoch == 4
    else:
        Epoch == 5
    x += 1

Fondamentalement, je veux créer une nouvelle variable "Epoch" basée sur la colonne Block. Les valeurs de bloc comprises entre 1 et 4 appartiennent à l'Époque 1, l'Époque 2 aux quatre autres et ainsi de suite. Cela ressemblerait à ceci:

Participant   Session   Trial_number    Accuracy    Block    Epoch
 G01S01          1             3             1          1          1
 G01S02          1             4             1          2          1
 G02S01          1             5             1          5          2
 G01S01          1             6             1          8          2
 G01S01          1             7             1          10         3

De plus, je souhaite également créer une autre variable basée sur l'ID de participant, si elle se termine par 1, le participant appartient au groupe 1, si il se termine par 2, le participant appartient au groupe 2.


J'ai essayé de faire le premier problème, mais fondamentalement, cela n'a pas fonctionné.

Participant   Session   Trial_number    Accuracy    Block
 G01S01          1             3             1          1
 G01S02          1             4             1          2
 G02S01          1             5             1          5
 G01S01          1             6             1          8
 G01S01          1             7             1          10

(179424 est le nombre de lignes dans ma feuille de calcul)


2 commentaires

Vous pouvez envisager de réécrire votre logique if-elif. Il n'est pas intuitif de voir x <5 suivi de 4


Oui, tu as raison. Il est visuellement plus attrayant et lisible.


4 Réponses :


2
votes

Vous pouvez utiliser pandas.cut pour cela pour créer des bacs et attribuer des étiquettes en fonction de ces bacs:

df['Epoch'] = pd.cut(df['Block'], 
                     [1,4,8,12], 
                     labels=[1,2,3],
                     include_lowest=True)

print(df)
  Participant  Session  Trial_number  Accuracy  Block Epoch
0      G01S01        1             3         1      1     1
1      G01S02        1             4         1      2     1
2      G02S01        1             5         1      5     2
3      G01S01        1             6         1      8     2
4      G01S01        1             7         1     10     3


5 commentaires

essayez df ['Group'] = df ['Participant']. str [-1] belle réponse Erfan bhai.


Cela a fonctionné pour moi! Merci. J'ai besoin de me pencher davantage sur les fonctions des pandas.


Heureux de pouvoir aider :) @CatM Oui, vous devriez consulter la documentation pandas, pour 90% de vos besoins, il y a une fonction pandas


Conseillez-vous un livre, un site Web, etc.?


En guise d'introduction de bas niveau, je suggérerais Data School sur youtube et en plus que la documentation pandas est également très utile. De plus, il couvre tout ce que les pandas offrent @CatM



0
votes

Je pense que vous souhaitez utiliser la méthode apply du bloc de données. Cette méthode prend une fonction comme argument et applique cette fonction à chaque ligne du dataframe (ou à chaque colonne, selon la valeur de axis ). D'après votre exemple de code, je soupçonne que ce serait une fonction significative:

df['Epoch'] = df.apply(derive_epoch, axis=1)

Ensuite, je l'applique simplement comme ceci:

def derive_epoch(row):
    if row['Block'] < 5:
        return 1
    elif row['Block'] < 9:
        return 2
    elif row['Block'] < 13:
        return 3
    elif row['Block'] < 17:
        return 4
    else:
        return 5

J'espère que cela vous aidera!]


1 commentaires

L'application est horriblement lente et ne doit généralement pas être utilisée. La solution la plus performante serait d'utiliser np.select



0
votes

Vous pouvez utiliser // pour extraire le numéro d'époque et appliquer à la colonne 'Block':

df['Epoch'] = df.apply(lambda x : x['Block']//4 +1)


0 commentaires

0
votes

Une autre solution très simple:

#Import pandas 
import pandas as pd

# Read csv file
df = pd.read_csv('merge.csv', sep=';')

# Add epoch column
df['Epoch'] = df['Block'] // 4 + 1
# Add group column
df['Group'] = df['Participant'].str[-1]

print(df)


0 commentaires