2017-10-17 3 views
0

Dites que j'ai un pandas df avec des entiers (valeur) dans une colonne. J'ai besoin de faire une deuxième colonne qui est égale à 0 lorsque la valeur est < 100, 1,00 lorsque la valeur> = 100, et ajouter 0,25 pour chaque augmentation de 25 et vice versa si la valeur diminue. MAIS je veux seulement ajouter 0,25 à la nouvelle colonne jusqu'à la valeur de 2,00, c'est-à-dire quatre fois max.Comment multiplier une colonne par incréments prédéfinis?

résultat 'taille' prévue:

value size 
90   0.00 
100   1.00 
110   1.00 
115   1.00 
125   1.25 
145   1.25 
150   1.50 
175   1.75 
195   1.75 
200   2.00 
230   2.00 
250   2.00 
200   2.00 
180   1.75 
150   1.50 
135   1.25 
120   1.00 
109   1.00 
99   0.00 

Tous les conseils seront les bienvenus!

+0

est 'size' censé être le résultat escompté? S'il vous plaît montrer vos efforts, cette solution est un peu impliqué. –

Répondre

3

Vous pouvez utiliser // (division entière):

In [11]: (df.value // 25) * 0.25 
Out[11]: 
0  0.75 
1  1.00 
2  1.00 
3  1.00 
4  1.25 
5  1.25 
6  1.50 
7  1.75 
8  1.75 
9  2.00 
10 2.25 
11 2.50 
12 2.00 
13 1.75 
14 1.50 
15 1.25 
16 1.00 
17 1.00 
18 0.75 
Name: value, dtype: float64 

qui vous amène la plupart du chemin, à l'exception de la condition < 100:

In [12]: (df.value >= 100) * ((df.value // 25) * 0.25) 
Out[12]: 
0  0.00 
1  1.00 
2  1.00 
3  1.00 
4  1.25 
5  1.25 
6  1.50 
7  1.75 
8  1.75 
9  2.00 
10 2.25 
11 2.50 
12 2.00 
13 1.75 
14 1.50 
15 1.25 
16 1.00 
17 1.00 
18 0.00 
Name: value, dtype: float64 

puis couper ceux sur 2 :

In [13]: (df.value >= 100) * ((df.value // 25) * 0.25).clip(0, 2) 
Out[13]: 
0  0.00 
1  1.00 
2  1.00 
3  1.00 
4  1.25 
5  1.25 
6  1.50 
7  1.75 
8  1.75 
9  2.00 
10 2.00 
11 2.00 
12 2.00 
13 1.75 
14 1.50 
15 1.25 
16 1.00 
17 1.00 
18 0.00 
Name: value, dtype: float64 
+2

peut-être 'df.value.clip (100, 200) // 25 * 0.25'? – MaxU

+1

@MaxU eep, oui, pas mal de choses là-bas (je pensais à l'origine que c'était juste '//'!) –

1

En utilisant pd.cut

R=list(range(100, 225,25)) 
R=[0]+R+[np.inf] 
label=[0]+list(np.arange(1.0,2.25,0.25)) 
pd.cut(df.value,R,labels=label,right=False) 

Out[16]: 
0  0.00 
1  1.00 
2  1.00 
3  1.00 
4  1.25 
5  1.25 
6  1.50 
7  1.75 
8  1.75 
9  2.00 
10 2.00 
11 2.00 
12 2.00 
13 1.75 
14 1.50 
15 1.25 
16 1.00 
17 1.00 
18 0.00 
1

Voici une solution très similaire à @Andy Hayden's solution:

In [80]: df['size'] = df['value'].clip(100, 200) // 25 * 0.25 

In [81]: df 
Out[81]: 
    value size 
0  90 1.00 
1  100 1.00 
2  110 1.00 
3  115 1.00 
4  125 1.25 
5  145 1.25 
6  150 1.50 
7  175 1.75 
8  195 1.75 
9  200 2.00 
10 230 2.00 
11 250 2.00 
12 200 2.00 
13 180 1.75 
14 150 1.50 
15 135 1.25 
16 120 1.00 
17 109 1.00 
18  99 1.00 
+0

@cJc mais c'est faux! Je ne mets pas les moins de 99 à 0 !! –

+0

@AndyHayden, oui, j'ai raté cette partie, merci! Je vais essayer de le réparer quand je serai de retour sur PC. – MaxU

+0

@AndyHayden Vous avez absolument raison, je n'avais pas la possibilité d'essayer cela jusqu'à présent. Merci d'avoir aidé et signalé cela. – cJc