我遇到了一个问题,无法更改数据框中的值。我还想咨询解决问题的方法以及使用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中实现相当容易,但我猜这将需要大量循环和数据结构化,这会显著减慢进程,并且我正在使用此进程来更深入地了解pandas的能力)
我想出了以下解决方案。作为准备步骤,我将按发言者名称进行分组,并使用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
所以,你看到问题了。什么也没有改变。我做错了什么?上述描述的问题是否应该使用pandas解决?
另外: 1. 我如何通过groupby对象来处理特定的分组?因为我认为,可以将文件设置为索引,按文件分组,然后使用该groupby对象将更改函数应用于其所有出现次数。但是,我没有找到一种方法来处理特定的分组,传递分组名称作为参数并在所有分组上调用apply,然后仅对其中一个进行操作似乎不是“正确”的方法。
希望这不要太长了...:)
.ix[example_file,'isUsed']
在这里查看:http://pandas.pydata.org/pandas-docs/dev/indexing.html#returning-a-view-versus-a-copy - Jeff