Mam problem z modyfikacją wartości w ramce danych. Chciałbym również poradzić się w sprawie problemu, który muszę rozwiązać, i właściwego sposobu wykorzystania pand, aby go rozwiązać. Będę wdzięczny za pomoc w obu przypadkach. Mam plik zawierający informacje o dopasowaniu poziomu plików audio do głośników. Plik wygląda mniej więcej tak:Zmienianie wartości w pandach Dataframe doenst work
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
To, co muszę zrobić, to rodzaj wyrafinowanego liczenia. Muszę pogrupować wyniki przez głośnik i obliczyć dla każdego głośnika jakieś obliczenia. Następnie kontynuuję pracę z głośnikiem, który wykonał dla mnie najlepsze obliczenia, ale przed kontynuowaniem muszę zaznaczyć wszystkie pliki, których użyłem do obliczeń jako używane, tj. Zmienić wartość isUsed dla każdego wiersza, w którym się pojawiają (mogą się pojawić pliki więcej niż jeden raz) na PRAWDA. Potem robię kolejną iterację. Obliczyć dla każdego głośnika, oznaczyć używane pliki i tak dalej, aż nie będzie już więcej głośników do obliczenia.
Pomyślałem dużo o tym, jak zaimplementować ten proces za pomocą pand (jest to dość łatwe do wdrożenia w zwykłym pythonie, ale zajmie dużo pętli i struktur danych, co moim zdaniem znacznie spowolni proces, a także używałem tego procesu, aby głębiej poznać zdolności pandy)
Wyszedłem z następującym rozwiązaniem. W ramach kroków przygotowawczych pogrupuję według nazwisk i ustawię nazwę pliku jako indeks według metody set_index. Następnie wykonam iterację nad groupbyObj i zastosuję funkcję obliczeniową, która zwróci wybrany głośnik i pliki, które mają być oznaczone jako używane.
Potem będę sprawdzać pliki i oznaczać je jako używane (będzie to szybkie i proste, ponieważ wcześniej ustawię je jako indeksy) i tak dalej, aż skończę obliczenia.
Po pierwsze, nie jestem pewien co do tego rozwiązania, więc możesz mi powiedzieć swoje przemyślenia na ten temat. Teraz próbowałem wykonawczych to i dostał w kłopoty:
Najpierw indeksowany według nazwy pliku, nie ma problemu tutaj:
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
Potem wybrać plik i sprawdził, że dostanę odpowiednie wpisy do tego pliku:
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
Teraz także problemy. Potem próbowałem zmienić isused wartość dla tego pliku na True, a gdzie mam problem:
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
Więc widać problem. Nic się nie zmieniło. Co ja robię źle? Czy problem opisany powyżej powinien zostać rozwiązany przy użyciu pand?
A także: 1. W jaki sposób mogę podejść do określonej grupy przez obiekt groupby? bcz Myślałem, że może zamiast ustawiać pliki jako indeksowane, grupować według pliku i używać tej grupy przez obj, aby zastosować funkcję zmieniającą do wszystkich jej wystąpień. Ale nie znalazłem sposobu, aby podejść do konkretnej grupy i przekazać nazwę grupy jako parametr i wywołać zastosowanie do wszystkich grup, a następnie działanie tylko na jednym z nich wydawało mi się nie "właściwe".
Mam nadzieję, że to nie jest długa ... :)
jesteś modyfikując kopię, tym '' .IX [example_file 'isused'] '' zobaczyć tutaj: http: // pandas.pydata.org/pandas-docs/dev/indexing.html#returning-a-view-versus-a-kopia – Jeff