データフレームの値を変更する際に問題があります。また、解決しなければならない問題と、それを解決するための pandas の適切な使用方法についても相談したいと思います。両方で助けていただければ幸いです。オーディオ ファイルとスピーカーの一致度に関する情報を含むファイルがあります。ファイルは次のようになります。
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
私がする必要があるのは、ある種の洗練されたカウントです。結果をスピーカーごとにグループ化し、スピーカーごとに計算する必要があります。次に、最適な計算を行ったスピーカーに進みますが、先に進む前に、計算に使用したすべてのファイルを使用済みとしてマークする必要があります。つまり、表示される各行の isUsed 値を変更します (ファイルが表示される可能性があります複数回) を TRUE にします。次に、別の反復を行います。スピーカーごとに計算し、使用したファイルをマークするなど、計算するスピーカーがなくなるまで繰り返します。
pandas を使用してそのプロセスを実装する方法についてよく考えました (通常の python で実装するのは非常に簡単ですが、多くのループとデータ構造化が必要になるため、プロセスが大幅に遅くなると思います。また、これを使用していますパンダの能力をより深く学ぶプロセス)
私は次の解決策を思いつきました。下準備としてスピーカー名でグループ化し、set_indexメソッドでファイル名をインデックスに設定します。次に、groupbyObj を反復処理して計算関数を適用します。これにより、選択したスピーカーと、使用済みとしてマークされるファイルが返されます。
次に、ファイルを繰り返し処理し、使用済みとしてマークします (事前にインデックスとして設定しているので、これは高速で簡単です)、計算が完了するまで同様の処理を繰り返します。
まず、この解決策についてよくわからないので、お気軽にご意見をお聞かせください。今、私はこれを実装しようとしましたが、問題が発生しました:
最初にファイル名でインデックスを作成しましたが、ここでは問題ありません:
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
次に、ファイルを選択し、そのファイルに関連するエントリを取得することを確認しました。
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
ここでも問題が発生します。次に、そのファイルの isUsed 値を True に変更しようとしたところ、問題が発生しました。
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
それで、あなたは問題を見ます。何も変わっていません。私は何を間違っていますか?上記の問題は、パンダを使用して解決する必要がありますか?
また: 1. groupby オブジェクトによって特定のグループにアプローチするにはどうすればよいですか? bcz ファイルをインデックス付きとして設定する代わりに、ファイルごとにグループ化し、その groupby obj を使用してすべての出現箇所に変更関数を適用するのではないかと考えました。しかし、特定のグループにアプローチする方法が見つかりませんでした。グループ名をパラメータとして渡し、すべてのグループに apply を呼び出してから、そのうちの 1 つだけを操作するのは「正しくない」ように思えました。
長くないことを願っています... :)