J'ai une grande trame de données qui ressemble à:
df1['A'].ix[1:3]
2017-01-01 02:00:00 [33, 34, 39]
2017-01-01 03:00:00 [3, 43, 9]
Je veux remplacer chaque élément supérieur à 9 par 11.
Ainsi, la sortie souhaitée pour l'exemple ci-dessus est:
df1['A'].ix[1:3]
2017-01-01 02:00:00 [11, 11, 11]
2017-01-01 03:00:00 [3, 11, 9]
Modifier:
Ma trame de données réelle a environ 20 000 lignes et chaque ligne a une liste de taille 2000.
Existe-t-il un moyen d'utiliser numpy.minimum
fonction pour chaque ligne? Je suppose que ce sera plus rapide que list comprehension
méthode?
Vous pouvez utiliser apply
avec list comprehension
:
df1['A'] = df1['A'].apply(lambda x: [y if y <= 9 else 11 for y in x])
print (df1)
A
2017-01-01 02:00:00 [11, 11, 11]
2017-01-01 03:00:00 [3, 11, 9]
Une solution plus rapide est d'abord convertie en numpy array
puis utilisez numpy.where
:
a = np.array(df1['A'].values.tolist())
print (a)
[[33 34 39]
[ 3 43 9]]
df1['A'] = np.where(a > 9, 11, a).tolist()
print (df1)
A
2017-01-01 02:00:00 [11, 11, 11]
2017-01-01 03:00:00 [3, 11, 9]
Très simplement: df[df > 9] = 11
Vous pouvez utiliser l'indexation numpy, accessible via le .values
une fonction.
df['col'].values[df['col'].values > x] = y
où vous remplacez toute valeur supérieure à x par la valeur de y.
Donc, pour l'exemple de la question:
df1['A'].values[df1['A'] > 9] = 11
Je suis venu pour une solution pour remplacer chaque élément plus grand que h par 1 sinon 0, qui a la solution simple:
df = (df > h) * 1
(Cela ne résout pas la question de l'OP car tous les df <= h sont remplacés par 0.)