Sto riscontrando un problema durante la modifica dei valori in un dataframe. Voglio anche consultare un problema che devo risolvere e il modo corretto di usare i panda per risolverlo. Apprezzerò l'aiuto su entrambi. Ho un file contenente informazioni sul grado di corrispondenza dei file audio agli altoparlanti. Il file è qualcosa del genere:Modifica dei valori in pda dati del data center senza lavoro
wave_path spk_name spk_example# score mark comments isUsed
190 122_65_02.04.51.800.wav idoD idoD 88 NaN NaN False
191 121_110_20.17.27.400.wav idoD idoD 87 NaN NaN False
192 121_111_00.34.57.300.wav idoD idoD 87 NaN NaN False
193 103_31_18.59.12.800.wav idoD idoD_0 99 HIT VP False
194 131_101_02.08.06.500.wav idoD idoD_0 96 HIT VP False
Quello che devo fare è una specie di conteggio sofisticato. Ho bisogno di raggruppare i risultati per altoparlante e calcolare per ogni altoparlante qualche calcolo. Quindi procedo con l'oratore che ha fatto il miglior calcolo per me, ma prima di procedere ho bisogno di marcare tutti i file che ho usato per il calcolo come usati, cioè cambiare il valore isUsed per ogni riga in cui appaiono (i file possono apparire più di una volta) a VERO. Quindi faccio un'altra iterazione. Calcola per ciascun altoparlante, segna i file usati e così via fino a quando non ci sono più relatori da calcolare.
Ho pensato molto a come implementare quel processo usando i panda (è abbastanza facile da implementare in Python regolare ma richiederà un sacco di cicli e strutturazione dei dati che la mia ipotesi rallenterà significativamente il processo, e anche io sto usando questo processo per imparare a conoscere le abilità dei panda più profondamente)
Sono uscito con la seguente soluzione. Come passi di preparazione, raggrupperò per nome dell'altoparlante e imposteremo il nome del file come indice dal metodo set_index. Quindi eseguirò l'iterazione sul groupbyObj e applicherò la funzione di calcolo, che restituirà l'altoparlante selezionato ei file da contrassegnare come usati.
Quindi eseguirò l'iterazione sui file e li contrassegnerò come usati (ciò sarebbe rapido e semplice poiché li ho impostati come indici in anticipo), e così via fino al termine del calcolo.
In primo luogo, non sono sicuro di questa soluzione, quindi sentitevi liberi di dirmi cosa ne pensate. Ora, ho provato l'attuazione del presente, e messo nei guai:
Per prima cosa ho indicizzato per nome del file, non è un problema qui:
In [53]:
marked_results['isUsed'] = False
ind_res = marked_results.set_index('wave_path')
ind_res.head()
Out[53]:
spk_name spk_example# score mark comments isUsed
wave_path
103_31_18.59.12.800.wav idoD idoD 99 HIT VP False
131_101_02.08.06.500.wav idoD idoD 99 HIT VP False
144_35_22.46.38.700.wav idoD idoD 96 HIT VP False
41_09_17.10.11.700.wav idoD idoD 93 HIT TEST False
122_188_03.19.20.400.wav idoD idoD 93 NaN NaN False
Poi ho scegliere un file e controllato che ricevo le voci rilevanti a quel file:
In [54]:
example_file = ind_res.index[0];
ind_res.ix[example_file]
Out[54]:
spk_name spk_example# score mark comments isUsed
wave_path
103_31_18.59.12.800.wav idoD idoD 99 HIT VP False
103_31_18.59.12.800.wav idoD idoD_0 99 HIT VP False
103_31_18.59.12.800.wav idoD idoD_1 97 HIT VP False
103_31_18.59.12.800.wav idoD idoD_2 95 HIT VP False
Ora anche qui problemi. Poi ho provato a cambiare il valore isused per quel file su True, e che dove ho ottenuto il problema:
In [56]:
ind_res.ix[example_file]['isUsed'] = True
ind_res.ix[example_file].isUsed = True
ind_res.ix[example_file]
Out[56]:
spk_name spk_example# score mark comments isUsed
wave_path
103_31_18.59.12.800.wav idoD idoD 99 HIT VP False
103_31_18.59.12.800.wav idoD idoD_0 99 HIT VP False
103_31_18.59.12.800.wav idoD idoD_1 97 HIT VP False
103_31_18.59.12.800.wav idoD idoD_2 95 HIT VP False
Quindi, si vede il problema. Niente è cambiato. Che cosa sto facendo di sbagliato? Il problema descritto sopra dovrebbe essere risolto utilizzando i panda?
E inoltre: 1. Come posso avvicinarmi a un gruppo specifico con un oggetto groupby? bcz ho pensato forse invece di impostare i file come indicizzati, raggruppandoli per un file, e usando quel gruppo obj per applicare una funzione che cambia a tutte le sue occorrenze. Ma non ho trovato un modo per avvicinarmi a un gruppo specifico e passare il nome del gruppo come parametro e chiamare applicare su tutti i gruppi e quindi agire solo su uno di essi non sembrava "giusto" per me.
Spero che non è di lunga ... :)
si sta modificando una copia, il '' .ix [example_file, 'isused'] '' vedi qui: http: // pandas.pydata.org/pandas-docs/dev/indexing.html#returning-a-view-versus-a-copy – Jeff