2015-10-13 17 views
6

Supponiamo di avere un dataframe simili:Modifica dei valori di più colonne di un dataframe panda utilizzando colonna valori noti

Knownvalue A B C D E F G H 
    17.3413  0 0 0 0 0 0 0 0 
    33.4534  0 0 0 0 0 0 0 0 

quello che voglio fare è che quando Knownvalue è tra 0-10, A è cambiato da 0 a 1. E quando Knownvalue è tra 10-20, B è cambiato da 0 a 1, così via.

Dovrebbe essere come questo dopo la modifica:

Knownvalue  A B C D E F G H 
    17.3413  0 1 0 0 0 0 0 0 
    33.4534  0 0 0 1 0 0 0 0 

Qualcuno sa come applicare un metodo di cambiarlo?

+0

(Nota: il testo è molto più comodo delle immagini, perché è possibile copiare e incollare testo. Di conseguenza sono tornato alle versioni di testo.) – DSM

risposta

5

Prima ho inserito la serie Knownvalue in una lista di numeri interi pari al suo valore troncato diviso per dieci (ad esempio 27.87 // 10 = 2). Questi bucket rappresentano il numero intero per la posizione della colonna desiderata. Poiché Knownvalue si trova nella prima colonna, ne aggiungo uno a questi valori.

Successivamente, enumero attraverso questi valori bin che effettivamente mi danno coppie di tuple di indici interi di righe e colonne. Uso iat per impostare il valore di queste posizioni pari a 1.

import pandas as pd 
import numpy as np 

# Create some sample data. 
df_vals = pd.DataFrame({'Knownvalue': np.random.random(5) * 50}) 
df = pd.concat([df_vals, pd.DataFrame(np.zeros((5, 5)), columns=list('ABCDE'))], axis=1) 

# Create desired column locations based on the `Knownvalue`. 
bins = (df.Knownvalue // 10).astype('int').tolist() 
>>> bins 
[4, 3, 0, 1, 0] 

# Set these locations equal to 1. 
for idx, col in enumerate(bins): 
    df.iat[idx, col + 1] = 1 # The first column is the `Knownvalue`, hence col + 1 

>>> df 
    Knownvalue A B C D E 
0 47.353937 0 0 0 0 1 
1 37.460338 0 0 0 1 0 
2 3.797964 1 0 0 0 0 
3 18.323131 0 1 0 0 0 
4 7.927030 1 0 0 0 0 
+0

Hai dimenticato di includere l'importazione 'numpy', sembra buono tho – Leb

+0

cosa fa applicare (floor) qui? Non lo so davvero ... –

+0

Puoi spiegare "per n, c in enumerate (idx): df.iat [n, c + 1] = 1"? –

4

Un diverso approccio sarebbe di ricostruire il telaio dalla colonna usando Knownvalue get_dummies:

>>> import string 
>>> new_cols = pd.get_dummies(df["Knownvalue"]//10).loc[:,range(8)].fillna(0) 
>>> new_cols.columns = list(string.ascii_uppercase)[:len(new_cols.columns)] 
>>> pd.concat([df[["Knownvalue"]], new_cols], axis=1) 
    Knownvalue A B C D E F G H 
0  17.3413 0 1 0 0 0 0 0 0 
1  33.4534 0 0 0 1 0 0 0 0 

get_dummies fa il lavoro duro :

>>> (df.Knownvalue//10) 
0 1 
1 3 
Name: Knownvalue, dtype: float64 
>>> pd.get_dummies((df.Knownvalue//10)) 
    1 3 
0 1 0 
1 0 1 
Problemi correlati