2016-05-22 12 views
5

Ho un DataFrame pieno di float (positivo e negativo) e un po 'di NaN. mi piacerebbe sostituire ogni singolo numero del galleggiante con il suo segno:Riempimento di un DataFrame con i numeri di "segno"

if it's NaN -> it remains Nan 
if positive -> replace with 1 
if negative -> replace with -1 
if zero -> leave it as 0 

Eventuali suggerimenti per rendere questa sostituzione massiccia?

Grazie in anticipo

risposta

4

È possibile utilizzare boolean indexing:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A':[-1,3,0,5], 
        'B':[4,5,6,5], 
        'C':[8,-9,np.nan,7]}) 

print (df) 
    A B C 
0 -1 4 8.0 
1 3 5 -9.0 
2 0 6 NaN 
3 5 5 7.0 
print (df > 0) 
     A  B  C 
0 False True True 
1 True True False 
2 False True False 
3 True True True 

print (df < 0) 
     A  B  C 
0 True False False 
1 False False True 
2 False False False 
3 False False False 

df[df > 0] = 1 
df[df < 0] = -1 

print (df) 
    A B C 
0 -1 1 1.0 
1 1 1 -1.0 
2 0 1 NaN 
3 1 1 1.0 
+0

Come funziona questo metodo quando c'è un'altra colonna con un diverso tipo di dati come 'float'? –

+0

Penso che OP dice che ci sono float e NaN. Quindi penso che ci siano solo valori numerici. – jezrael

+0

Hai ragione, ma esiste un modo in cui questo metodo potrebbe funzionare in un caso generico? –

2

Codice -

import pandas as pd 


df = pd.DataFrame({'x' : [-5.3, 2.5, 0, float('nan')]}) 

df['x'] = df['x'].apply(func = lambda x : x if not x else x // abs(x)) 

print(df) 

uscita -

x 
0 -1 
1 1 
2 0 
3 NaN 
+0

perché si fa a creare funzione lambda? '.apply (modify)' funzionerebbe bene – lejlot

+0

@lejlot aggiornato :) –

9

È possibile utilizzare np.sign:

df 
Out[100]: 
    A 
0 -4.0 
1 2.0 
2 NaN 
3 0.0 

import numpy as np 
np.sign(df["A"]) 

Out[101]: 
0 -1.0 
1 1.0 
2 NaN 
3 0.0 
Name: A, dtype: float64 

Al fine di applicare a tutte le colonne, y ou può passare direttamente alla dataframe:

df 
Out[121]: 
      0   1   2   3 
0 -2.932447 -1.686652  NaN -0.908441 
1 1.254436 0.000000 0.072242 0.796944 
2 2.626737 0.169639 -1.457195 1.169238 
3 0.000000 -1.174251 0.660111 1.115518 
4 -1.998091 -0.125095 0.000000 -0.506782 

np.sign(df) 
Out[122]: 
    0 1 2 3 
0 -1.0 -1.0 NaN -1.0 
1 1.0 0.0 1.0 1.0 
2 1.0 1.0 -1.0 1.0 
3 0.0 -1.0 1.0 1.0 
4 -1.0 -1.0 0.0 -1.0 
+1

Puoi aggiungere una soluzione per tutte le colonne in 'Dataframe'? 'stampa (df.apply (np.sign)) ' – jezrael

+2

Soluzione super, molto bella. – jezrael

Problemi correlati