web-dev-qa-db-fra.com

Remplacement des valeurs supérieures à un nombre dans pandas dataframe

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?

13
Zanam

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]
10
jezrael

Très simplement: df[df > 9] = 11

9
Edouard Cuny

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

2
D.Griffiths

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.)

0
CFW