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)
4 Réponses :
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
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
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!]
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
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)
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)
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.